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 (&params.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, &params.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, &params,
+                                        &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(&current->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(&current->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)&&current->bproc.masq)hookname(func)args;}while(0)
-+#define bproc_hook_imr(func,args)      do{if(hookname(func)&&current->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)&&current->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,
-+				       (&regs,(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.
- 	 */
--	(&regs)->r20 = tsk->p_opptr->tgid;
--	return tsk->tgid;
-+	(&regs)->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, &regs);
- 	putname(filename);
- out:
-+	if (error == -ENOENT)
-+		error = bproc_hook_imv(error, sys_execve,
-+				       (&regs,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,&regs.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,&regs.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(&current->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(&regs);
-+	handle_sysrq((int)req->from, &regs, 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(&regs);
-+	handle_sysrq((int)req.from, &regs, 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 = &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 = &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 = &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 = &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 = &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 = &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 = &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(&reg->semaphore, 0);
- 			WRT_REG_WORD(&reg->host_cmd, HC_CLR_RISC_INT);
- 			WRT_REG_WORD(&reg->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(&reg->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(&current->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)&reg->flash_address);)
-+	    __func__,
-+	    (u_long)&reg->flash_address);)
- 
- 	spin_lock_irqsave(&ha->hardware_lock, flags);
- 
- 	/* Reset ISP chip. */
- 	WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
-+	CACHE_FLUSH(&reg->ctrl_status);
-+	/* Delay after reset, for chip to recover. */
-+	udelay(20);
- 	data = qla2x00_debounce_register(&reg->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(&reg->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(&reg->host_cmd, HC_RESET_RISC);
-+		CACHE_FLUSH(&reg->host_cmd);
- 		WRT_REG_WORD(&reg->host_cmd, HC_RELEASE_RISC);
-+		CACHE_FLUSH(&reg->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(&reg->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(&reg->mailbox1) != PROD_ID_1 ||
- 			    (RD_REG_WORD(&reg->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(&reg->req_q_in, 0);
- 	WRT_REG_WORD(&reg->req_q_out, 0);
- 	WRT_REG_WORD(&reg->rsp_q_in, 0);
- 	WRT_REG_WORD(&reg->rsp_q_out, 0);
-+	CACHE_FLUSH(&reg->rsp_q_out);
- #else
- 	WRT_REG_WORD(&reg->mailbox4, 0);
- 	WRT_REG_WORD(&reg->mailbox4, 0);
- 	WRT_REG_WORD(&reg->mailbox5, 0);
- 	WRT_REG_WORD(&reg->mailbox5, 0);
-+	CACHE_FLUSH(&reg->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(&reg->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(&reg->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(&reg->nvram, NV_DESELECT);
-+	CACHE_FLUSH(&reg->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(&reg->nvram, data | NV_SELECT);
-+	CACHE_FLUSH(&reg->nvram);
- 	NVRAM_DELAY();
--	/* qla2x00_nv_delay(ha); */
-+
- 	WRT_REG_WORD(&reg->nvram, data | NV_SELECT | NV_CLOCK);
--	/* qla2x00_nv_delay(ha); */
-+	CACHE_FLUSH(&reg->nvram);
- 	NVRAM_DELAY();
-+
- 	WRT_REG_WORD(&reg->nvram, data | NV_SELECT);
--	/* qla2x00_nv_delay(ha); */
-+	CACHE_FLUSH(&reg->nvram);
- 	NVRAM_DELAY();
- }
- 
-@@ -8676,6 +8283,7 @@ qla2x00_nv_deselect(scsi_qla_host_t *ha)
- 	device_reg_t *reg = ha->iobase;
- 
- 	WRT_REG_WORD(&reg->nvram, NV_DESELECT);
-+	CACHE_FLUSH(&reg->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(&reg->istatus);
- 		if (data & RISC_INT) {
- 			data = RD_REG_WORD(&reg->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(&reg->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(&reg->mailbox4);
- 	WRT_REG_WORD(&reg->mailbox4, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->mailbox4);
- #else
--	reg_flushed = CACHE_FLUSH(&reg->req_q_in);
- 	WRT_REG_WORD(&reg->req_q_in, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->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(&reg->mailbox4);
- 	WRT_REG_WORD(&reg->mailbox4, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->mailbox4);
- #else
--	reg_flushed = CACHE_FLUSH(&reg->req_q_in);
- 	WRT_REG_WORD(&reg->req_q_in, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->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(&reg->mailbox4, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->mailbox4);
- #else
- 	WRT_REG_WORD(&reg->req_q_in, ha->req_ring_index);
-+	CACHE_FLUSH(&reg->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(&reg->host_cmd, HC_RESET_RISC);
-+		CACHE_FLUSH(&reg->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(&reg->host_cmd, HC_CLR_RISC_INT);
-+			CACHE_FLUSH(&reg->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(&reg->mailbox1);
- #else
-@@ -10930,6 +10320,10 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_
- #endif
- 
- 			mailbox[2] = RD_REG_WORD(&reg->mailbox2);
-+			mailbox[3] = RD_REG_WORD(&reg->mailbox3);
-+			mailbox[5] = RD_REG_WORD(&reg->mailbox5);
-+			mailbox[6] = RD_REG_WORD(&reg->mailbox6);
-+			mailbox[7] = RD_REG_WORD(&reg->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(&reg->semaphore, 0);
- 		WRT_REG_WORD(&reg->host_cmd, HC_CLR_RISC_INT);
-+		CACHE_FLUSH(&reg->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(&reg->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(&reg->mailbox5, ha->rsp_ring_index);
-+	CACHE_FLUSH(&reg->mailbox5);
- #else
- 	WRT_REG_WORD(&reg->rsp_q_out, ha->rsp_ring_index);
-+	CACHE_FLUSH(&reg->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(&reg->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(&reg->ctrl_status, 0x10);
- 
- 	/* Reset frame buffer FIFOs. */
-+#if defined(ISP2200)
- 	WRT_REG_WORD(&reg->fb_cmd, 0xa000);
-+#else
-+	WRT_REG_WORD(&reg->fb_cmd, 0x00fc);
-+
-+	/* Read back fb_cmd until zero or 3 seconds max */
-+	for (cnt = 0; cnt < 3000; cnt++) {
-+		if ((RD_REG_WORD(&reg->fb_cmd) & 0xff) == 0)
-+			break;
-+		udelay(100);
-+	}
-+
-+
-+#endif
- 
- 	/* Select RISC module registers. */
- 	WRT_REG_WORD(&reg->ctrl_status, 0);
-@@ -12764,7 +12426,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) 
- 	WRT_REG_WORD(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->nvram, NV_SELECT);
--
--	/* Enable Flash Read/Write. */
--	WRT_REG_WORD(&reg->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(&reg->ctrl_status, 0);
--	WRT_REG_WORD(&reg->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(&reg_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(&reg_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(&reg->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(&reg->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(&reg->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(&reg->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(
- 				    &reg->istatus)) & RISC_INT) {
- 
- 					data =RD_REG_WORD(&reg->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(&reg->host_status_lo)) &
-+		    HOST_STATUS_INT))
-+			qla2x00_isr(ha, data, &discard);
-+#else
-+
-+		while (!(ha->flags.in_isr) &&
-+		    ((data = qla2x00_debounce_register(&reg->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(&reg->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(&reg->host_status_lo)) &
--		    HOST_STATUS_INT))
--			qla2x00_isr(ha, data, &discard);
--#else
--
--		while (!(ha->flags.in_isr) &&
--		    ((data = qla2x00_debounce_register(&reg->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(&current->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(&current->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(&regs->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(&regs->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(&current->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(&current->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(&current->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(&current->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(&current->sigmask_lock);
++	sigfillset(&current->blocked);
++	flush_signals(current);
++	spin_unlock_irq(&current->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(&current->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(&current->thread.regs.regs) = (void *) (&sig + 1);
++	disable = (1 << (SIGVTALRM - 1)) | (1 << (SIGALRM - 1)) |
++		(1 << (SIGIO - 1)) | (1 << (SIGPROF - 1));
++	SC_SIGMASK(UPT_SC(&current->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, &current->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(&current->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, &copy, 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 = &current->sig->action[SIGSEGV - 1];
++		ka = &current->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 = &current->sig->action[sig -1 ];
++	ka = &current->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(&current->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(&current->thread.regs));
+-	void *mask = sp_to_mask(PT_REGS_SP(&current->thread.regs));
++	void __user *sc = sp_to_sc(PT_REGS_SP(&current->thread.regs));
++	void __user *mask = sp_to_mask(PT_REGS_SP(&current->thread.regs));
+ 	int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
+ 
+ 	spin_lock_irq(&current->sighand->siglock);
+@@ -257,8 +296,8 @@
+ 
+ int sys_rt_sigreturn(struct pt_regs regs)
+ {
+-	struct ucontext *uc = sp_to_uc(PT_REGS_SP(&current->thread.regs));
+-	void *fp;
++	unsigned long sp = PT_REGS_SP(&current->thread.regs);
++	struct ucontext __user *uc = sp_to_uc(sp);
+ 	int sig_size = _NSIG_WORDS * sizeof(unsigned long);
+ 
+ 	spin_lock_irq(&current->sighand->siglock);
+@@ -266,7 +305,6 @@
+ 	sigdelsetmask(&current->blocked, ~_BLOCKABLE);
+ 	recalc_sigpending();
+ 	spin_unlock_irq(&current->sighand->siglock);
+-	fp = (void *) (((unsigned long) uc) + sizeof(struct ucontext));
+ 	copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext,
+ 			  &signal_frame_si.common.arch);
+ 	return(PT_REGS_SYSCALL_RET(&current->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(&regs->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, &regs) < 0)
++			panic("check_ptrace : failed to read child "
++			      "registers, errno = %d", errno);
++		regs.orig_eax = pid;
++		if (ptrace(PTRACE_SETREGS, pid, 0, &regs) < 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', &current->thread.regs, NULL, NULL);
++	handle_sysrq('p', &current->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(&regions_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(&regions_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),
++				     &current->thread.fault_addr,
++				     &current->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),
+-				     &current->thread.fault_addr,
+-				     &current->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, &current_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(&current->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, &current->thread.exec_buf);
+ 	if(n == 1)
+ 		userspace(&current->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(&current->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, &current->thread.fault_addr,
++				   &current->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, &current->thread.fault_addr,
++				 &current->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, 
++				   &current->thread.fault_addr,
++				   &current->thread.fault_catcher);
++	if(n < 0) return(-EFAULT);
++	return(n);
++}
++
++int __clear_user_tt(void *mem, int len)
++{
++	return(__do_clear_user(mem, len,
++			       &current->thread.fault_addr,
++			       &current->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, &current->thread.fault_addr,
++			       &current->thread.fault_catcher));
++}
++
++int strnlen_user_tt(const void *str, int len)
++{
++	return(__do_strnlen_user(str, len,
++				 &current->thread.fault_addr,
++				 &current->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, &current->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, 
+-				   &current->thread.fault_addr,
+-				   &current->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, 
+-				   &current->thread.fault_addr,
+-				   &current->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, 
+-				   &current->thread.fault_addr,
+-				   &current->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,
+-			       &current->thread.fault_addr,
+-			       &current->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, 
+-			       &current->thread.fault_addr,
+-			       &current->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,
+-				 &current->thread.fault_addr,
+-				 &current->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, 
+-			      &sectorsize, bitmap_offset_out);
++	err = read_cow_header(file_reader, &fd, &version, &backing_file, &mtime,
++			      &size, &sectorsize, &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(&regs);
+ }
+ 
+-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", &not_configged_ops },
-+#endif
-+
-+#ifdef CONFIG_NULL_CHAN
-+	{ "null", &null_ops },
-+#else
-+	{ "null", &not_configged_ops },
-+#endif
-+
-+#ifdef CONFIG_PORT_CHAN
-+	{ "port", &port_ops },
-+#else
-+	{ "port", &not_configged_ops },
-+#endif
-+
-+#ifdef CONFIG_PTY_CHAN
-+	{ "pty", &pty_ops },
-+	{ "pts", &pts_ops },
-+#else
-+	{ "pty", &not_configged_ops },
-+	{ "pts", &not_configged_ops },
-+#endif
-+
-+#ifdef CONFIG_TTY_CHAN
-+	{ "tty", &tty_ops },
-+#else
-+	{ "tty", &not_configged_ops },
-+#endif
-+
-+#ifdef CONFIG_XTERM_CHAN
-+	{ "xterm", &xterm_ops },
-+#else
-+	{ "xterm", &not_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, &current->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(&notify_spinlock);
-+}
-+
-+void unlock_notify(void)
-+{
-+	spin_unlock(&notify_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, &eth_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(&eth->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, &eth_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, &eth_cmd_line){
-+		eth = list_entry(ele, struct eth_init, list);
-+
-+		if(eth_setup_common(eth->init, eth->index))
-+			list_del(&eth->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(&uml_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, 
-+			      &sectorsize, 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(&regs->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(&regs), \
-+			           UM_SYSCALL_ARG2(&regs), \
-+				   UM_SYSCALL_ARG3(&regs), \
-+				   UM_SYSCALL_ARG4(&regs), \
-+				   UM_SYSCALL_ARG5(&regs), \
-+				   UM_SYSCALL_ARG6(&regs))
-+
-+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, &current->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) &sc;
-+	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, &current->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(&regions_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(&regions_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),
-+				     &current->thread.fault_addr,
-+				     &current->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(&current->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 = &current_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 = &current_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 = &current->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(&current->sigmask_lock);
-+		sigorsets(&current->blocked, &current->blocked, 
-+			  &ka->sa.sa_mask);
-+		sigaddset(&current->blocked, signr);
-+		recalc_sigpending(current);
-+		spin_unlock_irq(&current->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 = &current->blocked;
-+
-+	for (;;) {
-+		unsigned long signr;
-+
-+		spin_lock_irq(&current->sigmask_lock);
-+		signr = dequeue_signal(&current->blocked, &info);
-+		spin_unlock_irq(&current->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(&current->blocked, signr)) {
-+				send_sig_info(signr, &info, current);
-+				continue;
-+			}
-+		}
-+
-+		ka = &current->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, &current->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(&current->thread.regs)))
-+		(void) CHOOSE_MODE(current->thread.mode.tt.singlestep_syscall = 1, 0);
-+
-+	return(0);
-+}
-+
-+int do_signal(int error)
-+{
-+	return(kern_do_signal(&current->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(&current->sigmask_lock);
-+	saveset = current->blocked;
-+	siginitset(&current->blocked, mask);
-+	recalc_sigpending(current);
-+	spin_unlock_irq(&current->sigmask_lock);
-+
-+	while (1) {
-+		current->state = TASK_INTERRUPTIBLE;
-+		schedule();
-+		if(kern_do_signal(&current->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(&current->sigmask_lock);
-+	saveset = current->blocked;
-+	current->blocked = newset;
-+	recalc_sigpending(current);
-+	spin_unlock_irq(&current->sigmask_lock);
-+
-+	while (1) {
-+		current->state = TASK_INTERRUPTIBLE;
-+		schedule();
-+		if (kern_do_signal(&current->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(&current->thread.regs));
-+	void *mask = sp_to_mask(PT_REGS_SP(&current->thread.regs));
-+	int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
-+
-+	spin_lock_irq(&current->sigmask_lock);
-+	copy_from_user(&current->blocked.sig[0], sc_sigmask(sc), 
-+		       sizeof(current->blocked.sig[0]));
-+	copy_from_user(&current->blocked.sig[1], mask, sig_size);
-+	sigdelsetmask(&current->blocked, ~_BLOCKABLE);
-+	recalc_sigpending(current);
-+	spin_unlock_irq(&current->sigmask_lock);
-+	copy_sc_from_user(&current->thread.regs, sc, 
-+			  &signal_frame_sc.common.arch);
-+	return(PT_REGS_SYSCALL_RET(&current->thread.regs));
-+}
-+
-+int sys_rt_sigreturn(struct pt_regs regs)
-+{
-+	struct ucontext *uc = sp_to_uc(PT_REGS_SP(&current->thread.regs));
-+	void *fp;
-+	int sig_size = _NSIG_WORDS * sizeof(unsigned long);
-+
-+	spin_lock_irq(&current->sigmask_lock);
-+	copy_from_user(&current->blocked, &uc->uc_sigmask, sig_size);
-+	sigdelsetmask(&current->blocked, ~_BLOCKABLE);
-+	recalc_sigpending(current);
-+	spin_unlock_irq(&current->sigmask_lock);
-+	fp = (void *) (((unsigned long) uc) + sizeof(struct ucontext));
-+	copy_sc_from_user(&current->thread.regs, &uc->uc_mcontext,
-+			  &signal_frame_si.common.arch);
-+	return(PT_REGS_SYSCALL_RET(&current->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, &copy, 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(&current->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, &current->thread.exec_buf);
-+	if(n == 1)
-+		userspace(&current->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(&current->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(&current->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, 
-+		       &current->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(&regs->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(&current->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(&regs.regs) = (struct sigcontext *) (&sig + 1)),
-+		    (void) (regs.regs.skas.is_user = 0));
-+	do_timer(&regs);
-+}
-+
-+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, &current->thread.fault_addr,
-+				   &current->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, &current->thread.fault_addr,
-+				 &current->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, 
-+				   &current->thread.fault_addr,
-+				   &current->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,
-+			       &current->thread.fault_addr,
-+			       &current->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, &current->thread.fault_addr,
-+			       &current->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,
-+				 &current->thread.fault_addr,
-+				 &current->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(&current->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, &current->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(&current->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(&current->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(&regs->regs),
-+			  UPT_SYSCALL_ARG2(&regs->regs)));
-+}
-+
-+static int check_utime(struct pt_regs *regs)
-+{
-+	return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs),
-+			  sizeof(struct utimbuf)));
-+}
-+
-+static int check_oldstat(struct pt_regs *regs)
-+{
-+	return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs), 
-+			  sizeof(struct __old_kernel_stat)));
-+}
-+
-+static int check_stat(struct pt_regs *regs)
-+{
-+	return(check_area((void *) UPT_SYSCALL_ARG1(&regs->regs), 
-+			  sizeof(struct stat)));
-+}
-+
-+static int check_stat64(struct pt_regs *regs)
-+{
-+	return(check_area((void *) UPT_SYSCALL_ARG1(&regs->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(&regs->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(&regs->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, &current_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', &current->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 		= &ethertap_user_info,
-+	.kern 		= &ethertap_kern_info,
-+	.private_size 	= sizeof(struct ethertap_data),
-+};
-+
-+static int register_ethertap(void)
-+{
-+	register_transport(&ethertap_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 *) &regs);
-+}
-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 $< -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:
-+
-+include $(TOPDIR)/Rules.make
-diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/misc.S um/arch/um/sys-ppc/misc.S
---- orig/arch/um/sys-ppc/misc.S	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/misc.S	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,116 @@
-+/*
-+ * This file contains miscellaneous low-level functions.
-+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
-+ *
-+ * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
-+ * and Paul Mackerras.
-+ *
-+ * A couple of functions stolen from arch/ppc/kernel/misc.S for UML
-+ * by Chris Emerson.
-+ *
-+ * 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/processor.h>
-+#include "ppc_asm.h"
-+
-+#if defined(CONFIG_4xx) || defined(CONFIG_8xx)
-+#define CACHE_LINE_SIZE		16
-+#define LG_CACHE_LINE_SIZE	4
-+#define MAX_COPY_PREFETCH	1
-+#elif !defined(CONFIG_PPC64BRIDGE)
-+#define CACHE_LINE_SIZE		32
-+#define LG_CACHE_LINE_SIZE	5
-+#define MAX_COPY_PREFETCH	4
-+#else
-+#define CACHE_LINE_SIZE		128
-+#define LG_CACHE_LINE_SIZE	7
-+#define MAX_COPY_PREFETCH	1
-+#endif /* CONFIG_4xx || CONFIG_8xx */
-+
-+	.text
-+
-+/*
-+ * Clear a page using the dcbz instruction, which doesn't cause any
-+ * memory traffic (except to write out any cache lines which get
-+ * displaced).  This only works on cacheable memory.
-+ */
-+_GLOBAL(clear_page)
-+	li	r0,4096/CACHE_LINE_SIZE
-+	mtctr	r0
-+#ifdef CONFIG_8xx
-+	li	r4, 0
-+1:	stw	r4, 0(r3)
-+	stw	r4, 4(r3)
-+	stw	r4, 8(r3)
-+	stw	r4, 12(r3)
-+#else
-+1:	dcbz	0,r3
-+#endif
-+	addi	r3,r3,CACHE_LINE_SIZE
-+	bdnz	1b
-+	blr
-+
-+/*
-+ * Copy a whole page.  We use the dcbz instruction on the destination
-+ * to reduce memory traffic (it eliminates the unnecessary reads of
-+ * the destination into cache).  This requires that the destination
-+ * is cacheable.
-+ */
-+#define COPY_16_BYTES		\
-+	lwz	r6,4(r4);	\
-+	lwz	r7,8(r4);	\
-+	lwz	r8,12(r4);	\
-+	lwzu	r9,16(r4);	\
-+	stw	r6,4(r3);	\
-+	stw	r7,8(r3);	\
-+	stw	r8,12(r3);	\
-+	stwu	r9,16(r3)
-+
-+_GLOBAL(copy_page)
-+	addi	r3,r3,-4
-+	addi	r4,r4,-4
-+	li	r5,4
-+
-+#ifndef CONFIG_8xx
-+#if MAX_COPY_PREFETCH > 1
-+	li	r0,MAX_COPY_PREFETCH
-+	li	r11,4
-+	mtctr	r0
-+11:	dcbt	r11,r4
-+	addi	r11,r11,CACHE_LINE_SIZE
-+	bdnz	11b
-+#else /* MAX_COPY_PREFETCH == 1 */
-+	dcbt	r5,r4
-+	li	r11,CACHE_LINE_SIZE+4
-+#endif /* MAX_COPY_PREFETCH */
-+#endif /* CONFIG_8xx */
-+
-+	li	r0,4096/CACHE_LINE_SIZE
-+	mtctr	r0
-+1:
-+#ifndef CONFIG_8xx
-+	dcbt	r11,r4
-+	dcbz	r5,r3
-+#endif
-+	COPY_16_BYTES
-+#if CACHE_LINE_SIZE >= 32
-+	COPY_16_BYTES
-+#if CACHE_LINE_SIZE >= 64
-+	COPY_16_BYTES
-+	COPY_16_BYTES
-+#if CACHE_LINE_SIZE >= 128
-+	COPY_16_BYTES
-+	COPY_16_BYTES
-+	COPY_16_BYTES
-+	COPY_16_BYTES
-+#endif
-+#endif
-+#endif
-+	bdnz	1b
-+	blr
-diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/miscthings.c um/arch/um/sys-ppc/miscthings.c
---- orig/arch/um/sys-ppc/miscthings.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/miscthings.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,53 @@
-+#include "linux/threads.h"
-+#include "linux/stddef.h"  // for NULL
-+#include "linux/elf.h"  // for AT_NULL
-+
-+/* The following function nicked from arch/ppc/kernel/process.c and
-+ * adapted slightly */
-+/*
-+ * XXX ld.so expects the auxiliary table to start on
-+ * a 16-byte boundary, so we have to find it and
-+ * move it up. :-(
-+ */
-+void shove_aux_table(unsigned long sp)
-+{
-+	int argc;
-+	char *p;
-+	unsigned long e;
-+	unsigned long aux_start, offset;
-+
-+	argc = *(int *)sp;
-+	sp += sizeof(int) + (argc + 1) * sizeof(char *);
-+	/* skip over the environment pointers */
-+	do {
-+		p = *(char **)sp;
-+		sp += sizeof(char *);
-+	} while (p != NULL);
-+	aux_start = sp;
-+	/* skip to the end of the auxiliary table */
-+	do {
-+		e = *(unsigned long *)sp;
-+		sp += 2 * sizeof(unsigned long);
-+	} while (e != AT_NULL);
-+	offset = ((aux_start + 15) & ~15) - aux_start;
-+	if (offset != 0) {
-+		do {
-+			sp -= sizeof(unsigned long);
-+			e = *(unsigned long *)sp;
-+			*(unsigned long *)(sp + offset) = e;
-+		} while (sp > aux_start);
-+	}
-+}
-+/* END stuff taken from arch/ppc/kernel/process.c */
-+
-+
-+/*
-+ * 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-ppc/ptrace.c um/arch/um/sys-ppc/ptrace.c
---- orig/arch/um/sys-ppc/ptrace.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/ptrace.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,28 @@
-+#include "linux/sched.h"
-+#include "asm/ptrace.h"
-+
-+int putreg(struct task_struct *child, unsigned long regno, 
-+		  unsigned long value)
-+{
-+	child->thread.process_regs.regs[regno >> 2] = value;
-+	return 0;
-+}
-+
-+unsigned long getreg(struct task_struct *child, unsigned long regno)
-+{
-+	unsigned long retval = ~0UL;
-+
-+	retval &= child->thread.process_regs.regs[regno >> 2];
-+	return retval;
-+}
-+
-+/*
-+ * 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-ppc/ptrace_user.c um/arch/um/sys-ppc/ptrace_user.c
---- orig/arch/um/sys-ppc/ptrace_user.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/ptrace_user.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,40 @@
-+#include <sys/ptrace.h>
-+#include <errno.h>
-+#include <asm/ptrace.h>
-+#include "sysdep/ptrace.h"
-+
-+int ptrace_getregs(long pid, unsigned long *regs_out)
-+{
-+    int i;
-+    for (i=0; i < sizeof(struct sys_pt_regs)/sizeof(PPC_REG); ++i) {
-+	errno = 0;
-+	regs_out->regs[i] = ptrace(PTRACE_PEEKUSER, pid, i*4, 0);
-+	if (errno) {
-+	    return -errno;
-+	}
-+    }
-+    return 0;
-+}
-+
-+int ptrace_setregs(long pid, unsigned long *regs_in)
-+{
-+    int i;
-+    for (i=0; i < sizeof(struct sys_pt_regs)/sizeof(PPC_REG); ++i) {
-+	if (i != 34 /* FIXME: PT_ORIG_R3 */ && i <= PT_MQ) {
-+	    if (ptrace(PTRACE_POKEUSER, pid, i*4, regs_in->regs[i]) < 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/sys-ppc/sigcontext.c um/arch/um/sys-ppc/sigcontext.c
---- orig/arch/um/sys-ppc/sigcontext.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/sigcontext.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,15 @@
-+#include "asm/ptrace.h"
-+#include "asm/sigcontext.h"
-+#include "sysdep/ptrace.h"
-+#include "user_util.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/sys-ppc/sysrq.c um/arch/um/sys-ppc/sysrq.c
---- orig/arch/um/sys-ppc/sysrq.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/sys-ppc/sysrq.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,43 @@
-+/* 
-+ * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk)
-+ * Licensed under the GPL
-+ */
-+
-+#include "linux/kernel.h"
-+#include "linux/smp.h"
-+#include "asm/ptrace.h"
-+#include "sysrq.h"
-+
-+void show_regs(struct pt_regs_subarch *regs)
-+{
-+	printk("\n");
-+	printk("show_regs(): insert regs here.\n");
-+#if 0
-+        printk("\n");
-+        printk("EIP: %04x:[<%08lx>] CPU: %d",0xffff & regs->xcs, regs->eip,
-+	       smp_processor_id());
-+        if (regs->xcs & 3)
-+                printk(" ESP: %04x:%08lx",0xffff & regs->xss, regs->esp);
-+        printk(" EFLAGS: %08lx\n", regs->eflags);
-+        printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
-+                regs->eax, regs->ebx, regs->ecx, regs->edx);
-+        printk("ESI: %08lx EDI: %08lx EBP: %08lx",
-+                regs->esi, regs->edi, regs->ebp);
-+        printk(" DS: %04x ES: %04x\n",
-+                0xffff & regs->xds, 0xffff & regs->xes);
-+#endif
-+
-+        show_trace(&regs->gpr[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/util/Makefile um/arch/um/util/Makefile
---- orig/arch/um/util/Makefile	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/util/Makefile	2002-10-23 21:09:14.000000000 -0400
-@@ -0,0 +1,26 @@
-+ALL = mk_task mk_constants
-+
-+all : $(ALL)
-+
-+mk_task : mk_task_user.o mk_task_kern.o
-+	$(CC) -o mk_task mk_task_user.o mk_task_kern.o
-+
-+mk_task_user.o : mk_task_user.c
-+	$(CC) -c $< 
-+
-+mk_task_kern.o : mk_task_kern.c
-+	$(CC) $(CFLAGS) -c $< 
-+
-+mk_constants : mk_constants_user.o mk_constants_kern.o
-+	$(CC) -o mk_constants mk_constants_user.o mk_constants_kern.o
-+
-+mk_constants_user.o : mk_constants_user.c
-+	$(CC) -c $< 
-+
-+mk_constants_kern.o : mk_constants_kern.c
-+	$(CC) $(CFLAGS) -c $< 
-+
-+clean :
-+	$(RM) $(ALL) *.o *~
-+
-+archmrproper : clean
-diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_kern.c um/arch/um/util/mk_constants_kern.c
---- orig/arch/um/util/mk_constants_kern.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/util/mk_constants_kern.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,24 @@
-+#include "linux/kernel.h"
-+#include "linux/stringify.h"
-+#include "asm/page.h"
-+
-+extern void print_head(void);
-+extern void print_constant_str(char *name, char *value);
-+extern void print_constant_int(char *name, int value);
-+extern void print_tail(void);
-+
-+int main(int argc, char **argv)
-+{
-+  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);
-+  print_constant_str("UM_KERN_ERR", KERN_ERR);
-+  print_constant_str("UM_KERN_WARNING", KERN_WARNING);
-+  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_tail();
-+  return(0);
-+}
-diff -Naur -X ../exclude-files orig/arch/um/util/mk_constants_user.c um/arch/um/util/mk_constants_user.c
---- orig/arch/um/util/mk_constants_user.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/util/mk_constants_user.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,28 @@
-+#include <stdio.h>
-+
-+void print_head(void)
-+{
-+  printf("/*\n");
-+  printf(" * Generated by mk_constants\n");
-+  printf(" */\n");
-+  printf("\n");
-+  printf("#ifndef __UM_CONSTANTS_H\n");
-+  printf("#define __UM_CONSTANTS_H\n");
-+  printf("\n");
-+}
-+
-+void print_constant_str(char *name, char *value)
-+{
-+  printf("#define %s \"%s\"\n", name, value);
-+}
-+
-+void print_constant_int(char *name, int value)
-+{
-+  printf("#define %s %d\n", name, value);
-+}
-+
-+void print_tail(void)
-+{
-+  printf("\n");
-+  printf("#endif\n");
-+}
-diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_kern.c um/arch/um/util/mk_task_kern.c
---- orig/arch/um/util/mk_task_kern.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/util/mk_task_kern.c	2002-12-08 21:03:34.000000000 -0500
-@@ -0,0 +1,17 @@
-+#include "linux/sched.h"
-+#include "linux/stddef.h"
-+
-+extern void print(char *name, char *type, int offset);
-+extern void print_ptr(char *name, char *type, int offset);
-+extern void print_head(void);
-+extern void print_tail(void);
-+
-+int main(int argc, char **argv)
-+{
-+  print_head();
-+  print_ptr("TASK_REGS", "union uml_pt_regs", 
-+	    offsetof(struct task_struct, thread.regs));
-+  print("TASK_PID", "int", offsetof(struct task_struct, pid));
-+  print_tail();
-+  return(0);
-+}
-diff -Naur -X ../exclude-files orig/arch/um/util/mk_task_user.c um/arch/um/util/mk_task_user.c
---- orig/arch/um/util/mk_task_user.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/arch/um/util/mk_task_user.c	2002-10-23 21:08:04.000000000 -0400
-@@ -0,0 +1,30 @@
-+#include <stdio.h>
-+
-+void print(char *name, char *type, int offset)
-+{
-+  printf("#define %s(task) *((%s *) &(((char *) (task))[%d]))\n", name, type,
-+	 offset);
-+}
-+
-+void print_ptr(char *name, char *type, int offset)
-+{
-+  printf("#define %s(task) ((%s *) &(((char *) (task))[%d]))\n", name, type,
-+	 offset);
-+}
-+
-+void print_head(void)
-+{
-+  printf("/*\n");
-+  printf(" * Generated by mk_task\n");
-+  printf(" */\n");
-+  printf("\n");
-+  printf("#ifndef __TASK_H\n");
-+  printf("#define __TASK_H\n");
-+  printf("\n");
-+}
-+
-+void print_tail(void)
-+{
-+  printf("\n");
-+  printf("#endif\n");
-+}
-diff -Naur -X ../exclude-files orig/CREDITS um/CREDITS
---- orig/CREDITS	2003-02-27 13:04:11.000000000 -0500
-+++ um/CREDITS	2003-02-27 13:05:17.000000000 -0500
-@@ -432,6 +432,7 @@
- E: lars@nocrew.org
- W: http://lars.nocrew.org/
- D: dsp56k device driver
-+D: ptrace proxy in user mode kernel port
- S: Kopmansg 2
- S: 411 13  Goteborg
- S: Sweden
-@@ -721,7 +722,7 @@
- E: jdike@karaya.com
- W: http://user-mode-linux.sourceforge.net
- D: User mode kernel port
--S: RR1 Box 67C
-+S: 375 Tubbs Hill Rd
- S: Deering NH 03244
- S: USA
- 
-diff -Naur -X ../exclude-files orig/Documentation/Configure.help um/Documentation/Configure.help
---- orig/Documentation/Configure.help	2003-02-27 13:04:11.000000000 -0500
-+++ um/Documentation/Configure.help	2003-02-27 13:05:17.000000000 -0500
-@@ -14690,19 +14690,23 @@
-   The module will be called dsbr100.o. If you want to compile it as a
-   module, say M here and read <file:Documentation/modules.txt>.
- 
--Always do synchronous disk IO for UBD
--CONFIG_BLK_DEV_UBD_SYNC
-+CONFIG_BLK_DEV_UBD
-   The User-Mode Linux port includes a driver called UBD which will let
-   you access arbitrary files on the host computer as block devices.
--  Writes to such a block device are not immediately written to the
--  host's disk; this may cause problems if, for example, the User-Mode
--  Linux 'Virtual Machine' uses a journalling file system and the host
--  computer crashes.
-+  Unless you know that you do not need such virtual block devices say
-+  Y here.
-+
-+Always do synchronous disk IO for UBD
-+CONFIG_BLK_DEV_UBD_SYNC
-+  Writes to the virtual block device are not immediately written to the host's
-+  disk; this may cause problems if, for example, the User-Mode Linux
-+  'Virtual Machine' uses a journalling filesystem and the host computer
-+  crashes.
- 
-   Synchronous operation (i.e. always writing data to the host's disk
-   immediately) is configurable on a per-UBD basis by using a special
-   kernel command line option.  Alternatively, you can say Y here to
--  turn on synchronous operation by default for all block.
-+  turn on synchronous operation by default for all block devices.
- 
-   If you're running a journalling file system (like reiserfs, for
-   example) in your virtual machine, you will want to say Y here.  If
-@@ -14714,6 +14718,7 @@
- CONFIG_PT_PROXY
-   This option enables a debugging interface which allows gdb to debug
-   the kernel without needing to actually attach to kernel threads.
-+  CONFIG_XTERM_CHAN must be enabled in order to enable CONFIG_PT_PROXY.
-   If you want to do kernel debugging, say Y here; otherwise say N.
- 
- Management console
-@@ -14908,26 +14913,174 @@
- 
- SLIP transport
- CONFIG_UML_NET_SLIP
--  The Slip User-Mode Linux network transport allows a running UML to
-+  The slip User-Mode Linux network transport allows a running UML to
-   network with its host over a point-to-point link.  Unlike Ethertap,
-   which can carry any Ethernet frame (and hence even non-IP packets),
--  the Slip transport can only carry IP packets.
-+  the slip transport can only carry IP packets.
- 
--  To use this, your host must support Slip devices.
-+  To use this, your host must support slip devices.
- 
-   For more information, see
-   <http://user-mode-linux.sourceforge.net/networking.html>.  That site
--  has examples of the UML command line to use to enable Slip
-+  has examples of the UML command line to use to enable slip
-   networking, and details of a few quirks with it.
- 
--  The Ethertap Transport is preferred over Slip because of its
--  limitation.  If you prefer Slip, however, say Y here.  Otherwise
-+  The Ethertap Transport is preferred over slip because of its
-+  limitations.  If you prefer slip, however, say Y here.  Otherwise
-   choose the Multicast transport (to network multiple UMLs on 
-   multiple hosts), Ethertap (to network with the host and the
-   outside world), and/or the Daemon transport (to network multiple
-   UMLs on a single host).  You may choose more than one without
-   conflict.  If you don't need UML networking, say N.
- 
-+SLiRP transport
-+CONFIG_UML_NET_SLIRP
-+  The SLiRP User-Mode Linux network transport allows a running UML
-+  to network by invoking a program that can handle SLIP encapsulated
-+  packets.  This is commonly (but not limited to) the application
-+  known as SLiRP, a program that can re-socket IP packets back onto
-+  the host on which it is run.  Only IP packets are supported,
-+  unlike other network transports that can handle all Ethernet
-+  frames.  In general, slirp allows the UML the same IP connectivity
-+  to the outside world that the host user is permitted, and unlike
-+  other transports, SLiRP works without the need of root level
-+  privleges, setuid binaries, or SLIP devices on the host.  This
-+  also means not every type of connection is possible, but most
-+  situations can be accomodated with carefully crafted slirp
-+  commands that can be passed along as part of the network device's
-+  setup string.  The effect of this transport on the UML is similar
-+  that of a host behind a firewall that masquerades all network
-+  connections passing through it (but is less secure).
-+
-+  To use this you should first have slirp compiled somewhere
-+  accessible on the host, and have read its documentation.  If you
-+  don't need UML networking, say N.
-+
-+  Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp"
-+
-+Default main console channel initialization
-+CONFIG_CON_ZERO_CHAN
-+  This is the string describing the channel to which the main console
-+  will be attached by default.  This value can be overridden from the
-+  command line.  The default value is "fd:0,fd:1", which attaches the
-+  main console to stdin and stdout.
-+  It is safe to leave this unchanged.
-+
-+Default console channel initialization
-+CONFIG_CON_CHAN
-+  This is the string describing the channel to which all consoles
-+  except the main console will be attached by default.  This value can
-+  be overridden from the command line.  The default value is "xterm",
-+  which brings them up in xterms.
-+  It is safe to leave this unchanged, although you may wish to change
-+  this if you expect the UML that you build to be run in environments
-+  which don't have X or xterm available.
-+
-+Default serial line channel initialization
-+CONFIG_SSL_CHAN
-+  This is the string describing the channel to which the serial lines
-+  will be attached by default.  This value can be overridden from the
-+  command line.  The default value is "pty", which attaches them to
-+  traditional pseudo-terminals.
-+  It is safe to leave this unchanged, although you may wish to change
-+  this if you expect the UML that you build to be run in environments
-+  which don't have a set of /dev/pty* devices.
-+
-+Nesting level
-+CONFIG_NEST_LEVEL
-+  This is set to the number of layers of UMLs that this UML will be run
-+  in.  Normally, this is zero, meaning that it will run directly on the
-+  host.  Setting it to one will build a UML that can run inside a UML
-+  that is running on the host.  Generally, if you intend this UML to run
-+  inside another UML, set CONFIG_NEST_LEVEL to one more than the host UML.
-+  Note that if the hosting UML has its CONFIG_KERNEL_HALF_GIGS set to 
-+  greater than one, then the guest UML should have its CONFIG_NEST_LEVEL 
-+  set to the host's CONFIG_NEST_LEVEL + CONFIG_KERNEL_HALF_GIGS.
-+  Only change this if you are running nested UMLs.
-+
-+Kernel address space size (in .5G units)
-+CONFIG_KERNEL_HALF_GIGS
-+  This determines the amount of address space that UML will allocate for
-+  its own, measured in half Gigabyte units.  The default is 1.
-+  Change this only if you need to boot UML with an unusually large amount
-+  of physical memory.
-+
-+UML sound support
-+CONFIG_UML_SOUND
-+  This option enables UML sound support.  If enabled, it will pull in
-+  soundcore and the UML hostaudio relay, which acts as a intermediary
-+  between the host's dsp and mixer devices and the UML sound system.
-+  It is safe to say 'Y' here.
-+
-+UML SMP support
-+CONFIG_UML_SMP
-+  This option enables UML SMP support.  UML implements virtual SMP by
-+  allowing as many processes to run simultaneously on the host as
-+  there are virtual processors configured.  Obviously, if the host is
-+  a uniprocessor, those processes will timeshare, but, inside UML,
-+  will appear to be running simultaneously.  If the host is a
-+  multiprocessor, then UML processes may run simultaneously, depending
-+  on the host scheduler.
-+  CONFIG_SMP will be set to whatever this option is set to.
-+  It is safe to leave this unchanged.
-+
-+file descriptor channel support
-+CONFIG_FD_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to already set up file descriptors.  Generally, the main
-+  console is attached to file descriptors 0 and 1 (stdin and stdout),
-+  so it would be wise to leave this enabled unless you intend to
-+  attach it to some other host device.
-+
-+null device channel support
-+CONFIG_NULL_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to a device similar to /dev/null.  Data written to it disappears
-+  and there is never any data to be read.
-+
-+port channel support
-+CONFIG_PORT_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host portals.  They may be accessed with 'telnet <host>
-+  <port number>'.  Any number of consoles and serial lines may be
-+  attached to a single portal, although what UML device you get when
-+  you telnet to that portal will be unpredictable.
-+  It is safe to say 'Y' here.
-+
-+pty channel support
-+CONFIG_PTY_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host pseudo-terminals.  Access to both traditional
-+  pseudo-terminals (/dev/pty*) and pts pseudo-terminals are controlled
-+  with this option.  The assignment of UML devices to host devices
-+  will be announced in the kernel message log.
-+  It is safe to say 'Y' here.
-+
-+tty channel support
-+CONFIG_TTY_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to host terminals.  Access to both virtual consoles
-+  (/dev/tty*) and the slave side of pseudo-terminals (/dev/ttyp* and
-+  /dev/pts/*) are controlled by this option.
-+  It is safe to say 'Y' here.
-+
-+xterm channel support
-+CONFIG_XTERM_CHAN
-+  This option enables support for attaching UML consoles and serial
-+  lines to xterms.  Each UML device so assigned will be brought up in
-+  its own xterm.
-+  If you disable this option, then CONFIG_PT_PROXY will be disabled as
-+  well, since UML's gdb currently requires an xterm.
-+  It is safe to say 'Y' here.
-+
-+tty logging
-+CONFIG_TTY_LOG
-+  This option enables logging of all data going through pseudo-terminals
-+  to the host.  This is primarily useful for honeypots, where you want
-+  secure keystroke logging that can't be detected or disabled by root.
-+  Say 'N' unless you are setting up a UML honeypot or otherwise know that
-+  you want this option.
-+
- Microtek USB scanner support
- CONFIG_USB_MICROTEK
-   Say Y here if you want support for the Microtek X6USB and
-diff -Naur -X ../exclude-files orig/drivers/char/Makefile um/drivers/char/Makefile
---- orig/drivers/char/Makefile	2003-02-27 13:04:15.000000000 -0500
-+++ um/drivers/char/Makefile	2003-02-27 13:05:21.000000000 -0500
-@@ -95,6 +95,12 @@
-   endif
- endif
- 
-+ifeq ($(ARCH),um)
-+  KEYMAP   =
-+  KEYBD    =
-+  CONSOLE  =
-+endif
-+
- ifeq ($(ARCH),sh)
-   KEYMAP   =
-   KEYBD    =
-diff -Naur -X ../exclude-files orig/drivers/char/tty_io.c um/drivers/char/tty_io.c
---- orig/drivers/char/tty_io.c	2003-02-27 13:04:15.000000000 -0500
-+++ um/drivers/char/tty_io.c	2003-02-27 13:05:21.000000000 -0500
-@@ -637,6 +637,9 @@
- 	wake_up_interruptible(&tty->write_wait);
- }
- 
-+extern int write_tty_log(int fd, const unsigned char *buf, int len, void *tty,
-+			 int direction);
-+
- static ssize_t tty_read(struct file * file, char * buf, size_t count, 
- 			loff_t *ppos)
- {
-@@ -677,8 +680,13 @@
- 	else
- 		i = -EIO;
- 	unlock_kernel();
--	if (i > 0)
-+	if (i > 0){
- 		inode->i_atime = CURRENT_TIME;
-+#ifdef CONFIG_TTY_LOG
-+		if(tty->log_fd >= 0) 
-+		  write_tty_log(tty->log_fd, buf, i, tty, 1);
-+#endif
-+	}
- 	return i;
- }
- 
-@@ -732,6 +740,10 @@
- 	if (written) {
- 		file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
- 		ret = written;
-+#ifdef CONFIG_TTY_LOG
-+		if(tty->log_fd >= 0) 
-+		  write_tty_log(tty->log_fd, buf - ret, ret, tty, 0);
-+#endif
- 	}
- 	up(&tty->atomic_write);
- 	return ret;
-@@ -945,6 +957,9 @@
- 			goto release_mem_out;
- 		}
- 	}
-+#ifdef CONFIG_TTY_LOG
-+	tty->log_fd = -1;
-+#endif
- 	goto success;
- 
- 	/*
-@@ -1039,6 +1054,8 @@
- 	free_tty_struct(tty);
- }
- 
-+extern int close_tty_log(int fd, void *tty);
-+
- /*
-  * Even releasing the tty structures is a tricky business.. We have
-  * to be very careful that the structures are all released at the
-@@ -1267,6 +1284,10 @@
- 	run_task_queue(&tq_timer);
- 	flush_scheduled_tasks();
- 
-+#ifdef CONFIG_TTY_LOG
-+	if(tty->log_fd >= 0) close_tty_log(tty->log_fd, tty);
-+#endif
-+
- 	/* 
- 	 * The release_mem function takes care of the details of clearing
- 	 * the slots and preserving the termios structure.
-@@ -1274,6 +1295,8 @@
- 	release_mem(tty, idx);
- }
- 
-+extern int open_tty_log(void *tty, void *current_tty); 
-+
- /*
-  * tty_open and tty_release keep up the tty count that contains the
-  * number of opens done on a tty. We cannot use the inode-count, as
-@@ -1425,6 +1448,11 @@
- 			nr_warns++;
- 		}
- 	}
-+
-+#ifdef CONFIG_TTY_LOG
-+	if(tty->log_fd < 0)
-+	       tty->log_fd = open_tty_log(tty, current->tty);
-+#endif
- 	return 0;
- }
- 
-diff -Naur -X ../exclude-files orig/drivers/net/setup.c um/drivers/net/setup.c
---- orig/drivers/net/setup.c	2002-09-15 12:13:19.000000000 -0400
-+++ um/drivers/net/setup.c	2002-10-23 21:08:05.000000000 -0400
-@@ -28,7 +28,6 @@
- extern int lmc_setup(void);
- 
- extern int madgemc_probe(void);
--extern int uml_net_probe(void);
- 
- /* Pad device name to IFNAMSIZ=16. F.e. __PAD6 is string of 9 zeros. */
- #define __PAD6 "\0\0\0\0\0\0\0\0\0"
-@@ -103,9 +102,6 @@
- #ifdef CONFIG_MADGEMC
- 	{madgemc_probe, 0},
- #endif
--#ifdef CONFIG_UML_NET
--	{uml_net_probe, 0},
--#endif
-  
- 	{NULL, 0},
- };
-diff -Naur -X ../exclude-files orig/include/asm-i386/hardirq.h um/include/asm-i386/hardirq.h
---- orig/include/asm-i386/hardirq.h	2002-09-15 12:13:19.000000000 -0400
-+++ um/include/asm-i386/hardirq.h	2003-05-28 11:02:07.000000000 -0400
-@@ -4,6 +4,7 @@
- #include <linux/config.h>
- #include <linux/threads.h>
- #include <linux/irq.h>
-+#include <asm/processor.h>		/* for cpu_relax */
- 
- /* assembly code in softirq.h is sensitive to the offsets of these fields */
- typedef struct {
-diff -Naur -X ../exclude-files orig/include/asm-um/a.out.h um/include/asm-um/a.out.h
---- orig/include/asm-um/a.out.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/a.out.h	2002-10-27 11:54:50.000000000 -0500
-@@ -0,0 +1,20 @@
-+#ifndef __UM_A_OUT_H
-+#define __UM_A_OUT_H
-+
-+#include "linux/config.h"
-+#include "asm/arch/a.out.h"
-+#include "choose-mode.h"
-+
-+#undef STACK_TOP
-+
-+extern unsigned long stacksizelim;
-+
-+extern unsigned long host_task_size;
-+
-+#define STACK_ROOM (stacksizelim)
-+
-+extern int honeypot;
-+#define STACK_TOP \
-+	CHOOSE_MODE((honeypot ? host_task_size : task_size), task_size)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/archparam-i386.h um/include/asm-um/archparam-i386.h
---- orig/include/asm-um/archparam-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/archparam-i386.h	2002-12-08 20:09:11.000000000 -0500
-@@ -0,0 +1,80 @@
-+/* 
-+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_ARCHPARAM_I386_H
-+#define __UM_ARCHPARAM_I386_H
-+
-+/********* Bits for asm-um/elf.h ************/
-+
-+#include "user.h"
-+
-+#define ELF_PLATFORM "i586"
-+
-+#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
-+
-+typedef struct user_i387_struct elf_fpregset_t;
-+typedef unsigned long elf_greg_t;
-+
-+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
-+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-+
-+#define ELF_DATA        ELFDATA2LSB
-+#define ELF_ARCH        EM_386
-+
-+#define ELF_PLAT_INIT(regs) do { \
-+	PT_REGS_EBX(regs) = 0; \
-+	PT_REGS_ECX(regs) = 0; \
-+	PT_REGS_EDX(regs) = 0; \
-+	PT_REGS_ESI(regs) = 0; \
-+	PT_REGS_EDI(regs) = 0; \
-+	PT_REGS_EBP(regs) = 0; \
-+	PT_REGS_EAX(regs) = 0; \
-+} while(0)
-+
-+/* Shamelessly stolen from include/asm-i386/elf.h */
-+
-+#define ELF_CORE_COPY_REGS(pr_reg, regs) do {	\
-+	pr_reg[0] = PT_REGS_EBX(regs);		\
-+	pr_reg[1] = PT_REGS_ECX(regs);		\
-+	pr_reg[2] = PT_REGS_EDX(regs);		\
-+	pr_reg[3] = PT_REGS_ESI(regs);		\
-+	pr_reg[4] = PT_REGS_EDI(regs);		\
-+	pr_reg[5] = PT_REGS_EBP(regs);		\
-+	pr_reg[6] = PT_REGS_EAX(regs);		\
-+	pr_reg[7] = PT_REGS_DS(regs);		\
-+	pr_reg[8] = PT_REGS_ES(regs);		\
-+	/* fake once used fs and gs selectors? */	\
-+	pr_reg[9] = PT_REGS_DS(regs);		\
-+	pr_reg[10] = PT_REGS_DS(regs);		\
-+	pr_reg[11] = PT_REGS_SYSCALL_NR(regs);	\
-+	pr_reg[12] = PT_REGS_IP(regs);		\
-+	pr_reg[13] = PT_REGS_CS(regs);		\
-+	pr_reg[14] = PT_REGS_EFLAGS(regs);	\
-+	pr_reg[15] = PT_REGS_SP(regs);		\
-+	pr_reg[16] = PT_REGS_SS(regs);		\
-+} while(0);
-+
-+/********* Bits for asm-um/delay.h **********/
-+
-+typedef unsigned long um_udelay_t;
-+
-+/********* Nothing for asm-um/hardirq.h **********/
-+
-+/********* Nothing for asm-um/hw_irq.h **********/
-+
-+/********* Nothing for asm-um/string.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/include/asm-um/archparam-ppc.h um/include/asm-um/archparam-ppc.h
---- orig/include/asm-um/archparam-ppc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/archparam-ppc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,41 @@
-+#ifndef __UM_ARCHPARAM_PPC_H
-+#define __UM_ARCHPARAM_PPC_H
-+
-+/********* Bits for asm-um/elf.h ************/
-+
-+#define ELF_PLATFORM (0)
-+
-+#define ELF_ET_DYN_BASE (0x08000000)
-+
-+/* the following stolen from asm-ppc/elf.h */
-+#define ELF_NGREG	48	/* includes nip, msr, lr, etc. */
-+#define ELF_NFPREG	33	/* includes fpscr */
-+/* General registers */
-+typedef unsigned long elf_greg_t;
-+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-+
-+/* Floating point registers */
-+typedef double elf_fpreg_t;
-+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
-+
-+#define ELF_DATA        ELFDATA2MSB
-+#define ELF_ARCH	EM_PPC
-+
-+/********* Bits for asm-um/delay.h **********/
-+
-+typedef unsigned int um_udelay_t;
-+
-+/********* Bits for asm-um/hw_irq.h **********/
-+
-+struct hw_interrupt_type;
-+
-+/********* Bits for asm-um/hardirq.h **********/
-+
-+#define irq_enter(cpu, irq) hardirq_enter(cpu)
-+#define irq_exit(cpu, irq) hardirq_exit(cpu)
-+
-+/********* Bits for asm-um/string.h **********/
-+
-+#define __HAVE_ARCH_STRRCHR
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/arch-signal-i386.h um/include/asm-um/arch-signal-i386.h
---- orig/include/asm-um/arch-signal-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/arch-signal-i386.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,24 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_ARCH_SIGNAL_I386_H
-+#define __UM_ARCH_SIGNAL_I386_H
-+
-+struct arch_signal_context {
-+	unsigned long extrasigs[_NSIG_WORDS];
-+};
-+
-+#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/include/asm-um/atomic.h um/include/asm-um/atomic.h
---- orig/include/asm-um/atomic.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/atomic.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_ATOMIC_H
-+#define __UM_ATOMIC_H
-+
-+#include "asm/arch/atomic.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/bitops.h um/include/asm-um/bitops.h
---- orig/include/asm-um/bitops.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/bitops.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_BITOPS_H
-+#define __UM_BITOPS_H
-+
-+#include "asm/arch/bitops.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/boot.h um/include/asm-um/boot.h
---- orig/include/asm-um/boot.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/boot.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_BOOT_H
-+#define __UM_BOOT_H
-+
-+#include "asm/arch/boot.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/bugs.h um/include/asm-um/bugs.h
---- orig/include/asm-um/bugs.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/bugs.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_BUGS_H
-+#define __UM_BUGS_H
-+
-+void check_bugs(void);
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/byteorder.h um/include/asm-um/byteorder.h
---- orig/include/asm-um/byteorder.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/byteorder.h	2003-02-27 13:20:12.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef __UM_BYTEORDER_H
-+#define __UM_BYTEORDER_H
-+
-+#include "asm/arch/byteorder.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/cache.h um/include/asm-um/cache.h
---- orig/include/asm-um/cache.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/cache.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_CACHE_H
-+#define __UM_CACHE_H
-+
-+#define        L1_CACHE_BYTES  32
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/checksum.h um/include/asm-um/checksum.h
---- orig/include/asm-um/checksum.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/checksum.h	2002-10-29 17:25:12.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef __UM_CHECKSUM_H
-+#define __UM_CHECKSUM_H
-+
-+#include "sysdep/checksum.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/cobalt.h um/include/asm-um/cobalt.h
---- orig/include/asm-um/cobalt.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/cobalt.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_COBALT_H
-+#define __UM_COBALT_H
-+
-+#include "asm/arch/cobalt.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/current.h um/include/asm-um/current.h
---- orig/include/asm-um/current.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/current.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,34 @@
-+/* 
-+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_CURRENT_H
-+#define __UM_CURRENT_H
-+
-+#ifndef __ASSEMBLY__
-+
-+#include "linux/config.h"
-+#include "asm/page.h"
-+
-+struct task_struct;
-+
-+#define CURRENT_TASK(dummy) (((unsigned long) &dummy) & \
-+			     (PAGE_MASK << CONFIG_KERNEL_STACK_ORDER))
-+
-+#define current ({ int dummy; (struct task_struct *) CURRENT_TASK(dummy); })
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#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/include/asm-um/delay.h um/include/asm-um/delay.h
---- orig/include/asm-um/delay.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/delay.h	2002-12-08 20:09:15.000000000 -0500
-@@ -0,0 +1,7 @@
-+#ifndef __UM_DELAY_H
-+#define __UM_DELAY_H
-+
-+#include "asm/arch/delay.h"
-+#include "asm/archparam.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/desc.h um/include/asm-um/desc.h
---- orig/include/asm-um/desc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/desc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_DESC_H
-+#define __UM_DESC_H
-+
-+#include "asm/arch/desc.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/div64.h um/include/asm-um/div64.h
---- orig/include/asm-um/div64.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/div64.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef _UM_DIV64_H
-+#define _UM_DIV64_H
-+
-+#include "asm/arch/div64.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/dma.h um/include/asm-um/dma.h
---- orig/include/asm-um/dma.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/dma.h	2002-10-27 16:53:42.000000000 -0500
-@@ -0,0 +1,10 @@
-+#ifndef __UM_DMA_H
-+#define __UM_DMA_H
-+
-+#include "asm/io.h"
-+
-+extern unsigned long uml_physmem;
-+
-+#define MAX_DMA_ADDRESS (uml_physmem)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/elf.h um/include/asm-um/elf.h
---- orig/include/asm-um/elf.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/elf.h	2002-12-08 20:13:07.000000000 -0500
-@@ -0,0 +1,18 @@
-+#ifndef __UM_ELF_H
-+#define __UM_ELF_H
-+
-+#include "asm/archparam.h"
-+
-+#define ELF_HWCAP (0)
-+
-+#define SET_PERSONALITY(ex, ibcs2) do ; while(0)
-+
-+#define ELF_EXEC_PAGESIZE 4096
-+
-+#define elf_check_arch(x) (1)
-+
-+#define ELF_CLASS ELFCLASS32
-+
-+#define USE_ELF_CORE_DUMP
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/errno.h um/include/asm-um/errno.h
---- orig/include/asm-um/errno.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/errno.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_ERRNO_H
-+#define __UM_ERRNO_H
-+
-+#include "asm/arch/errno.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/fcntl.h um/include/asm-um/fcntl.h
---- orig/include/asm-um/fcntl.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/fcntl.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_FCNTL_H
-+#define __UM_FCNTL_H
-+
-+#include "asm/arch/fcntl.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/fixmap.h um/include/asm-um/fixmap.h
---- orig/include/asm-um/fixmap.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/fixmap.h	2003-05-28 11:02:08.000000000 -0400
-@@ -0,0 +1,89 @@
-+#ifndef __UM_FIXMAP_H
-+#define __UM_FIXMAP_H
-+
-+#include <linux/config.h>
-+#include <asm/kmap_types.h>
-+
-+/*
-+ * Here we define all the compile-time 'special' virtual
-+ * addresses. The point is to have a constant address at
-+ * compile time, but to set the physical address only
-+ * in the boot process. We allocate these special  addresses
-+ * from the end of virtual memory (0xfffff000) backwards.
-+ * Also this lets us do fail-safe vmalloc(), we
-+ * can guarantee that these special addresses and
-+ * vmalloc()-ed addresses never overlap.
-+ *
-+ * these 'compile-time allocated' memory buffers are
-+ * fixed-size 4k pages. (or larger if used with an increment
-+ * highger than 1) use fixmap_set(idx,phys) to associate
-+ * physical memory with fixmap indices.
-+ *
-+ * TLB entries of such buffers will not be flushed across
-+ * task switches.
-+ */
-+
-+/*
-+ * on UP currently we will have no trace of the fixmap mechanizm,
-+ * no page table allocations, etc. This might change in the
-+ * future, say framebuffers for the console driver(s) could be
-+ * fix-mapped?
-+ */
-+enum fixed_addresses {
-+#ifdef CONFIG_HIGHMEM
-+	FIX_KMAP_BEGIN,	/* reserved pte's for temporary kernel mappings */
-+	FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
-+#endif
-+	__end_of_fixed_addresses
-+};
-+
-+extern void __set_fixmap (enum fixed_addresses idx,
-+			  unsigned long phys, pgprot_t flags);
-+
-+#define set_fixmap(idx, phys) \
-+		__set_fixmap(idx, phys, PAGE_KERNEL)
-+/*
-+ * Some hardware wants to get fixmapped without caching.
-+ */
-+#define set_fixmap_nocache(idx, phys) \
-+		__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-+/*
-+ * used by vmalloc.c.
-+ *
-+ * Leave one empty page between vmalloc'ed areas and
-+ * the start of the fixmap, and leave one page empty
-+ * at the top of mem..
-+ */
-+extern unsigned long get_kmem_end(void);
-+
-+#define FIXADDR_TOP	(get_kmem_end() - 0x2000)
-+#define FIXADDR_SIZE	(__end_of_fixed_addresses << PAGE_SHIFT)
-+#define FIXADDR_START	(FIXADDR_TOP - FIXADDR_SIZE)
-+
-+#define __fix_to_virt(x)	(FIXADDR_TOP - ((x) << PAGE_SHIFT))
-+
-+extern void __this_fixmap_does_not_exist(void);
-+
-+/*
-+ * 'index to address' translation. If anyone tries to use the idx
-+ * directly without tranlation, we catch the bug with a NULL-deference
-+ * kernel oops. Illegal ranges of incoming indices are caught too.
-+ */
-+static inline unsigned long fix_to_virt(const unsigned int idx)
-+{
-+	/*
-+	 * this branch gets completely eliminated after inlining,
-+	 * except when someone tries to use fixaddr indices in an
-+	 * illegal way. (such as mixing up address types or using
-+	 * out-of-range indices).
-+	 *
-+	 * If it doesn't get removed, the linker will complain
-+	 * loudly with a reasonably clear error message..
-+	 */
-+	if (idx >= __end_of_fixed_addresses)
-+		__this_fixmap_does_not_exist();
-+
-+        return __fix_to_virt(idx);
-+}
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/floppy.h um/include/asm-um/floppy.h
---- orig/include/asm-um/floppy.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/floppy.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_FLOPPY_H
-+#define __UM_FLOPPY_H
-+
-+#include "asm/arch/floppy.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/hardirq.h um/include/asm-um/hardirq.h
---- orig/include/asm-um/hardirq.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/hardirq.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_HARDIRQ_H
-+#define __UM_HARDIRQ_H
-+
-+#include "asm/arch/hardirq.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/hdreg.h um/include/asm-um/hdreg.h
---- orig/include/asm-um/hdreg.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/hdreg.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_HDREG_H
-+#define __UM_HDREG_H
-+
-+#include "asm/arch/hdreg.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/highmem.h um/include/asm-um/highmem.h
---- orig/include/asm-um/highmem.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/highmem.h	2003-05-28 11:02:08.000000000 -0400
-@@ -0,0 +1,12 @@
-+#ifndef __UM_HIGHMEM_H
-+#define __UM_HIGHMEM_H
-+
-+#include "asm/page.h"
-+#include "asm/fixmap.h"
-+#include "asm/arch/highmem.h"
-+
-+#undef PKMAP_BASE
-+
-+#define PKMAP_BASE ((FIXADDR_START - LAST_PKMAP * PAGE_SIZE) & PMD_MASK)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/hw_irq.h um/include/asm-um/hw_irq.h
---- orig/include/asm-um/hw_irq.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/hw_irq.h	2003-05-11 18:31:58.000000000 -0400
-@@ -0,0 +1,10 @@
-+#ifndef _ASM_UM_HW_IRQ_H
-+#define _ASM_UM_HW_IRQ_H
-+
-+#include "asm/irq.h"
-+#include "asm/archparam.h"
-+
-+static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i)
-+{}
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ide.h um/include/asm-um/ide.h
---- orig/include/asm-um/ide.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ide.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IDE_H
-+#define __UM_IDE_H
-+
-+#include "asm/arch/ide.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/init.h um/include/asm-um/init.h
---- orig/include/asm-um/init.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/init.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,11 @@
-+#ifndef _UM_INIT_H
-+#define _UM_INIT_H
-+
-+#ifdef notdef
-+#define __init
-+#define __initdata
-+#define __initfunc(__arginit) __arginit
-+#define __cacheline_aligned 
-+#endif
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ioctl.h um/include/asm-um/ioctl.h
---- orig/include/asm-um/ioctl.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ioctl.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IOCTL_H
-+#define __UM_IOCTL_H
-+
-+#include "asm/arch/ioctl.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ioctls.h um/include/asm-um/ioctls.h
---- orig/include/asm-um/ioctls.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ioctls.h	2002-10-23 21:11:14.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IOCTLS_H
-+#define __UM_IOCTLS_H
-+
-+#include "asm/arch/ioctls.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/io.h um/include/asm-um/io.h
---- orig/include/asm-um/io.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/io.h	2002-10-27 16:53:42.000000000 -0500
-@@ -0,0 +1,25 @@
-+#ifndef __UM_IO_H
-+#define __UM_IO_H
-+
-+#include "asm/page.h"
-+
-+#define IO_SPACE_LIMIT 0xdeadbeef /* Sure hope nothing uses this */
-+
-+static inline int inb(unsigned long i) { return(0); }
-+static inline void outb(char c, unsigned long i) { }
-+
-+/*
-+ * Change virtual addresses to physical addresses and vv.
-+ * These are pretty trivial
-+ */
-+static inline unsigned long virt_to_phys(volatile void * address)
-+{
-+	return __pa((void *) address);
-+}
-+
-+static inline void * phys_to_virt(unsigned long address)
-+{
-+	return __va(address);
-+}
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ipcbuf.h um/include/asm-um/ipcbuf.h
---- orig/include/asm-um/ipcbuf.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ipcbuf.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IPCBUF_H
-+#define __UM_IPCBUF_H
-+
-+#include "asm/arch/ipcbuf.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ipc.h um/include/asm-um/ipc.h
---- orig/include/asm-um/ipc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ipc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_IPC_H
-+#define __UM_IPC_H
-+
-+#include "asm/arch/ipc.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/irq.h um/include/asm-um/irq.h
---- orig/include/asm-um/irq.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/irq.h	2003-05-03 11:03:52.000000000 -0400
-@@ -0,0 +1,22 @@
-+#ifndef __UM_IRQ_H
-+#define __UM_IRQ_H
-+
-+#define TIMER_IRQ		0
-+#define UMN_IRQ			1
-+#define CONSOLE_IRQ		2
-+#define CONSOLE_WRITE_IRQ	3
-+#define UBD_IRQ			4
-+#define UM_ETH_IRQ		5
-+#define SSL_IRQ			6
-+#define SSL_WRITE_IRQ		7
-+#define ACCEPT_IRQ		8
-+#define MCONSOLE_IRQ		9
-+#define WINCH_IRQ		10
-+#define SIGIO_WRITE_IRQ 	11
-+#define TELNETD_IRQ 		12
-+#define XTERM_IRQ 		13
-+
-+#define LAST_IRQ XTERM_IRQ
-+#define NR_IRQS (LAST_IRQ + 1)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/keyboard.h um/include/asm-um/keyboard.h
---- orig/include/asm-um/keyboard.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/keyboard.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_KEYBOARD_H
-+#define __UM_KEYBOARD_H
-+
-+#include "asm/arch/keyboard.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/kmap_types.h um/include/asm-um/kmap_types.h
---- orig/include/asm-um/kmap_types.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/kmap_types.h	2003-02-27 13:20:14.000000000 -0500
-@@ -0,0 +1,11 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_KMAP_TYPES_H
-+#define __UM_KMAP_TYPES_H
-+
-+#include "asm/arch/kmap_types.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/linux_logo.h um/include/asm-um/linux_logo.h
---- orig/include/asm-um/linux_logo.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/linux_logo.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_LINUX_LOGO_H
-+#define __UM_LINUX_LOGO_H
-+
-+#include "asm/arch/linux_logo.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/locks.h um/include/asm-um/locks.h
---- orig/include/asm-um/locks.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/locks.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_LOCKS_H
-+#define __UM_LOCKS_H
-+
-+#include "asm/arch/locks.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/mca_dma.h um/include/asm-um/mca_dma.h
---- orig/include/asm-um/mca_dma.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/mca_dma.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef mca___UM_DMA_H
-+#define mca___UM_DMA_H
-+
-+#include "asm/arch/mca_dma.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/mman.h um/include/asm-um/mman.h
---- orig/include/asm-um/mman.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/mman.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_MMAN_H
-+#define __UM_MMAN_H
-+
-+#include "asm/arch/mman.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/mmu_context.h um/include/asm-um/mmu_context.h
---- orig/include/asm-um/mmu_context.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/mmu_context.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,72 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_MMU_CONTEXT_H
-+#define __UM_MMU_CONTEXT_H
-+
-+#include "linux/sched.h"
-+#include "choose-mode.h"
-+
-+#define get_mmu_context(task) do ; while(0)
-+#define activate_context(tsk) do ; while(0)
-+
-+static inline void activate_mm(struct mm_struct *old, struct mm_struct *new)
-+{
-+}
-+
-+extern void switch_mm_skas(int mm_fd);
-+
-+static inline 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);
-+		if(next != &init_mm)
-+			CHOOSE_MODE((void) 0, 
-+				    switch_mm_skas(next->context.skas.mm_fd));
-+	}
-+}
-+
-+static inline void enter_lazy_tlb(struct mm_struct *mm, 
-+				  struct task_struct *tsk, unsigned cpu)
-+{
-+}
-+
-+extern int init_new_context_skas(struct task_struct *task, 
-+				 struct mm_struct *mm);
-+
-+static inline int init_new_context_tt(struct task_struct *task, 
-+				      struct mm_struct *mm)
-+{
-+	return(0);
-+}
-+
-+static inline int init_new_context(struct task_struct *task, 
-+				   struct mm_struct *mm)
-+{
-+	return(CHOOSE_MODE_PROC(init_new_context_tt, init_new_context_skas, 
-+				task, mm));
-+}
-+
-+extern void destroy_context_skas(struct mm_struct *mm);
-+
-+static inline void destroy_context(struct mm_struct *mm)
-+{
-+	CHOOSE_MODE((void) 0, destroy_context_skas(mm));
-+}
-+
-+#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/include/asm-um/mmu.h um/include/asm-um/mmu.h
---- orig/include/asm-um/mmu.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/mmu.h	2002-11-09 12:51:11.000000000 -0500
-@@ -0,0 +1,22 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __MMU_H
-+#define __MMU_H
-+
-+#include "um_mmu.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/include/asm-um/module.h um/include/asm-um/module.h
---- orig/include/asm-um/module.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/module.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_MODULE_H
-+#define __UM_MODULE_H
-+
-+#include "asm/arch/module.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/msgbuf.h um/include/asm-um/msgbuf.h
---- orig/include/asm-um/msgbuf.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/msgbuf.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_MSGBUF_H
-+#define __UM_MSGBUF_H
-+
-+#include "asm/arch/msgbuf.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/mtrr.h um/include/asm-um/mtrr.h
---- orig/include/asm-um/mtrr.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/mtrr.h	2003-05-29 13:46:27.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_MTRR_H
-+#define __UM_MTRR_H
-+
-+#include "asm/arch/mtrr.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/namei.h um/include/asm-um/namei.h
---- orig/include/asm-um/namei.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/namei.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_NAMEI_H
-+#define __UM_NAMEI_H
-+
-+#include "asm/arch/namei.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/page.h um/include/asm-um/page.h
---- orig/include/asm-um/page.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/page.h	2002-10-27 16:49:35.000000000 -0500
-@@ -0,0 +1,53 @@
-+#ifndef __UM_PAGE_H
-+#define __UM_PAGE_H
-+
-+struct page;
-+
-+#include "asm/arch/page.h"
-+
-+#undef BUG
-+#undef PAGE_BUG
-+#undef __pa
-+#undef __va
-+#undef virt_to_page
-+#undef VALID_PAGE
-+#undef PAGE_OFFSET
-+#undef KERNELBASE
-+
-+extern unsigned long uml_physmem;
-+
-+#define PAGE_OFFSET (uml_physmem)
-+#define KERNELBASE PAGE_OFFSET
-+
-+#ifndef __ASSEMBLY__
-+
-+extern void stop(void);
-+
-+#define BUG() do { \
-+	panic("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
-+} while (0)
-+
-+#define PAGE_BUG(page) do { \
-+	BUG(); \
-+} while (0)
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#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 struct page *page_mem_map(struct page *page);
-+
-+extern struct page *pfn_to_page(unsigned long pfn);
-+
-+#define VALID_PAGE(page) (page_mem_map(page) != NULL)
-+
-+extern struct page *arch_validate(struct page *page, int mask, int order);
-+#define HAVE_ARCH_VALIDATE
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/page_offset.h um/include/asm-um/page_offset.h
---- orig/include/asm-um/page_offset.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/page_offset.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1 @@
-+#define PAGE_OFFSET_RAW (uml_physmem)
-diff -Naur -X ../exclude-files orig/include/asm-um/param.h um/include/asm-um/param.h
---- orig/include/asm-um/param.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/param.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,24 @@
-+#ifndef _UM_PARAM_H
-+#define _UM_PARAM_H
-+
-+#ifndef HZ
-+#define HZ 52
-+#endif
-+
-+#define EXEC_PAGESIZE   4096
-+
-+#ifndef NGROUPS
-+#define NGROUPS         32
-+#endif
-+
-+#ifndef NOGROUP
-+#define NOGROUP         (-1)
-+#endif
-+
-+#define MAXHOSTNAMELEN  64      /* max length of hostname */
-+
-+#ifdef __KERNEL__
-+# define CLOCKS_PER_SEC 100    /* frequency at which times() counts */
-+#endif
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/pci.h um/include/asm-um/pci.h
---- orig/include/asm-um/pci.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/pci.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_PCI_H
-+#define __UM_PCI_H
-+
-+#define PCI_DMA_BUS_IS_PHYS     (1)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/pgalloc.h um/include/asm-um/pgalloc.h
---- orig/include/asm-um/pgalloc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/pgalloc.h	2003-05-28 11:02:08.000000000 -0400
-@@ -0,0 +1,162 @@
-+/* 
-+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
-+ * Derived from include/asm-i386/pgalloc.h and include/asm-i386/pgtable.h
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PGALLOC_H
-+#define __UM_PGALLOC_H
-+
-+#include "linux/config.h"
-+#include "linux/mm.h"
-+#include "asm/fixmap.h"
-+#include "choose-mode.h"
-+
-+#define pgd_quicklist (current_cpu_data.pgd_quick)
-+#define pmd_quicklist (current_cpu_data.pmd_quick)
-+#define pte_quicklist (current_cpu_data.pte_quick)
-+#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz)
-+
-+#define pmd_populate(mm, pmd, pte) set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
-+
-+/*
-+ * Allocate and free page tables.
-+ */
-+
-+static inline pgd_t *get_pgd_slow_tt(void)
-+{
-+	pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
-+
-+	if (pgd) {
-+		memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
-+		memcpy(pgd + USER_PTRS_PER_PGD, 
-+		       swapper_pg_dir + USER_PTRS_PER_PGD, 
-+		       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-+	}
-+	return pgd;
-+}
-+
-+static inline pgd_t *get_pgd_slow_skas(void)
-+{
-+	pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
-+
-+	if (pgd)
-+		memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
-+	return pgd;
-+}
-+
-+static inline pgd_t *get_pgd_slow(void)
-+{
-+	return(CHOOSE_MODE(get_pgd_slow_tt(), get_pgd_slow_skas()));
-+}
-+
-+static inline pgd_t *get_pgd_fast(void)
-+{
-+	unsigned long *ret;
-+
-+	if ((ret = pgd_quicklist) != NULL) {
-+		pgd_quicklist = (unsigned long *)(*ret);
-+		ret[0] = 0;
-+		pgtable_cache_size--;
-+	} else
-+		ret = (unsigned long *)get_pgd_slow();
-+	return (pgd_t *)ret;
-+}
-+
-+static inline void free_pgd_fast(pgd_t *pgd)
-+{
-+	*(unsigned long *)pgd = (unsigned long) pgd_quicklist;
-+	pgd_quicklist = (unsigned long *) pgd;
-+	pgtable_cache_size++;
-+}
-+
-+static inline void free_pgd_slow(pgd_t *pgd)
-+{
-+	free_page((unsigned long)pgd);
-+}
-+
-+static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-+{
-+	pte_t *pte;
-+
-+	pte = (pte_t *) __get_free_page(GFP_KERNEL);
-+	if (pte)
-+		clear_page(pte);
-+	return pte;
-+}
-+
-+static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
-+{
-+	unsigned long *ret;
-+
-+	if ((ret = (unsigned long *)pte_quicklist) != NULL) {
-+		pte_quicklist = (unsigned long *)(*ret);
-+		ret[0] = ret[1];
-+		pgtable_cache_size--;
-+	}
-+	return (pte_t *)ret;
-+}
-+
-+static inline void pte_free_fast(pte_t *pte)
-+{
-+	*(unsigned long *)pte = (unsigned long) pte_quicklist;
-+	pte_quicklist = (unsigned long *) pte;
-+	pgtable_cache_size++;
-+}
-+
-+static inline void pte_free_slow(pte_t *pte)
-+{
-+	free_page((unsigned long)pte);
-+}
-+
-+#define pte_free(pte)           pte_free_fast(pte)
-+#define pgd_free(pgd)           free_pgd_slow(pgd)
-+#define pgd_alloc(mm)           get_pgd_fast()
-+
-+/*
-+ * allocating and freeing a pmd is trivial: the 1-entry pmd is
-+ * inside the pgd, so has no extra memory associated with it.
-+ */
-+
-+#define pmd_alloc_one_fast(mm, addr)	({ BUG(); ((pmd_t *)1); })
-+#define pmd_alloc_one(mm, addr)		({ BUG(); ((pmd_t *)2); })
-+#define pmd_free_slow(x)		do { } while (0)
-+#define pmd_free_fast(x)		do { } while (0)
-+#define pmd_free(x)			do { } while (0)
-+#define pgd_populate(mm, pmd, pte)	BUG()
-+
-+/*
-+ * TLB flushing:
-+ *
-+ *  - flush_tlb() flushes the current mm struct TLBs
-+ *  - flush_tlb_all() flushes all processes TLBs
-+ *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
-+ *  - flush_tlb_page(vma, vmaddr) flushes one page
-+ *  - flush_tlb_kernel_vm() flushes the kernel vm area
-+ *  - flush_tlb_range(mm, start, end) flushes a range of pages
-+ *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
-+ */
-+
-+extern void flush_tlb_all(void);
-+extern void flush_tlb_mm(struct mm_struct *mm);
-+extern void flush_tlb_range(struct mm_struct *mm, unsigned long start, 
-+			    unsigned long end);
-+extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
-+extern void flush_tlb_kernel_vm(void);
-+
-+static inline void flush_tlb_pgtables(struct mm_struct *mm,
-+				      unsigned long start, unsigned long end)
-+{
-+}
-+
-+#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/include/asm-um/pgtable.h um/include/asm-um/pgtable.h
---- orig/include/asm-um/pgtable.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/pgtable.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,428 @@
-+/* 
-+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
-+ * Derived from include/asm-i386/pgtable.h
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PGTABLE_H
-+#define __UM_PGTABLE_H
-+
-+#include "linux/sched.h"
-+#include "asm/processor.h"
-+#include "asm/page.h"
-+
-+extern pgd_t swapper_pg_dir[1024];
-+
-+#define flush_cache_all() do ; while (0)
-+#define flush_cache_mm(mm) do ; while (0)
-+#define flush_cache_range(vma, start, end) do ; while (0)
-+#define flush_cache_page(vma, vmaddr) do ; while (0)
-+#define flush_page_to_ram(page) do ; while (0)
-+#define flush_dcache_page(page)	do ; while (0)
-+#define flush_icache_range(from, to) do ; while (0)
-+#define flush_icache_page(vma,pg) do ; while (0)
-+#define flush_icache_user_range(vma,pg,adr,len)	do ; while (0)
-+
-+extern void __flush_tlb_one(unsigned long addr);
-+
-+extern void pte_free(pte_t *pte);
-+
-+extern void pgd_free(pgd_t *pgd);
-+
-+extern int do_check_pgt_cache(int, int);
-+
-+extern void *um_virt_to_phys(struct task_struct *task, unsigned long virt,
-+			     pte_t *pte_out);
-+
-+/* zero page used for uninitialized stuff */
-+extern unsigned long *empty_zero_page;
-+
-+#define pgtable_cache_init() do ; while (0)
-+
-+/* PMD_SHIFT determines the size of the area a second-level page table can map */
-+#define PMD_SHIFT	22
-+#define PMD_SIZE	(1UL << PMD_SHIFT)
-+#define PMD_MASK	(~(PMD_SIZE-1))
-+
-+/* PGDIR_SHIFT determines what a third-level page table entry can map */
-+#define PGDIR_SHIFT	22
-+#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)
-+#define PGDIR_MASK	(~(PGDIR_SIZE-1))
-+
-+/*
-+ * entries per page directory level: the i386 is two-level, so
-+ * we don't really have any PMD directory physically.
-+ */
-+#define PTRS_PER_PTE	1024
-+#define PTRS_PER_PMD	1
-+#define PTRS_PER_PGD	1024
-+#define USER_PTRS_PER_PGD	(TASK_SIZE/PGDIR_SIZE)
-+#define FIRST_USER_PGD_NR       0
-+
-+#define pte_ERROR(e) \
-+        printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
-+#define pmd_ERROR(e) \
-+        printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
-+#define pgd_ERROR(e) \
-+        printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
-+
-+/*
-+ * pgd entries used up by user/kernel:
-+ */
-+
-+#define USER_PGD_PTRS (TASK_SIZE >> PGDIR_SHIFT)
-+#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
-+
-+#ifndef __ASSEMBLY__
-+/* Just any arbitrary offset to the start of the vmalloc VM area: the
-+ * current 8MB value just means that there will be a 8MB "hole" after the
-+ * physical memory until the kernel virtual memory starts.  That means that
-+ * any out-of-bounds memory accesses will hopefully be caught.
-+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
-+ * area for the same reason. ;)
-+ */
-+
-+extern unsigned long high_physmem;
-+
-+#define VMALLOC_OFFSET	(__va_space)
-+#define VMALLOC_START	(((unsigned long) high_physmem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
-+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
-+
-+#if CONFIG_HIGHMEM
-+# define VMALLOC_END	(PKMAP_BASE-2*PAGE_SIZE)
-+#else
-+# define VMALLOC_END	(FIXADDR_START-2*PAGE_SIZE)
-+#endif
-+
-+#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 REGION_MASK	0xf0000000
-+#define REGION_SHIFT	28
-+
-+#define _PAGE_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-+#define _KERNPG_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
-+#define _PAGE_CHG_MASK	(PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
-+
-+#define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-+#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_COPY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_KERNEL	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
-+#define PAGE_KERNEL_RO	__pgprot(_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED)
-+
-+/*
-+ * The i386 can't do page protection for execute, and considers that the same are read.
-+ * Also, write permissions imply read permissions. This is the closest we can get..
-+ */
-+#define __P000	PAGE_NONE
-+#define __P001	PAGE_READONLY
-+#define __P010	PAGE_COPY
-+#define __P011	PAGE_COPY
-+#define __P100	PAGE_READONLY
-+#define __P101	PAGE_READONLY
-+#define __P110	PAGE_COPY
-+#define __P111	PAGE_COPY
-+
-+#define __S000	PAGE_NONE
-+#define __S001	PAGE_READONLY
-+#define __S010	PAGE_SHARED
-+#define __S011	PAGE_SHARED
-+#define __S100	PAGE_READONLY
-+#define __S101	PAGE_READONLY
-+#define __S110	PAGE_SHARED
-+#define __S111	PAGE_SHARED
-+
-+/*
-+ * Define this if things work differently on an i386 and an i486:
-+ * it will (on an i486) warn about kernel memory accesses that are
-+ * done without a 'verify_area(VERIFY_WRITE,..)'
-+ */
-+#undef TEST_VERIFY_AREA
-+
-+/* page table for 0-4MB for everybody */
-+extern unsigned long pg0[1024];
-+
-+/*
-+ * BAD_PAGETABLE is used when we need a bogus page-table, while
-+ * BAD_PAGE is used for a bogus page.
-+ *
-+ * ZERO_PAGE is a global shared page that is always zero: used
-+ * for zero-mapped memory areas etc..
-+ */
-+extern pte_t __bad_page(void);
-+extern pte_t * __bad_pagetable(void);
-+
-+#define BAD_PAGETABLE __bad_pagetable()
-+#define BAD_PAGE __bad_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))
-+
-+/* to align the pointer to a pointer address */
-+#define PTR_MASK			(~(sizeof(void*)-1))
-+
-+/* sizeof(void*)==1<<SIZEOF_PTR_LOG2 */
-+/* 64-bit machines, beware!  SRB. */
-+#define SIZEOF_PTR_LOG2			2
-+
-+/* to find an entry in a page-table */
-+#define PAGE_PTR(address) \
-+((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK)
-+
-+#define pte_none(x)	!(pte_val(x) & ~_PAGE_NEWPAGE)
-+#define pte_present(x)	(pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
-+
-+#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)
-+#define pmd_clear(xp)	do { pmd_val(*(xp)) = _PAGE_NEWPAGE; } while (0)
-+
-+#define pmd_newpage(x)  (pmd_val(x) & _PAGE_NEWPAGE)
-+#define pmd_mkuptodate(x) (pmd_val(x) &= ~_PAGE_NEWPAGE)
-+
-+/*
-+ * The "pgd_xxx()" functions here are trivial for a folded two-level
-+ * setup: the pgd is never bad, and a pmd always exists (as it's folded
-+ * into the pgd entry)
-+ */
-+static inline int pgd_none(pgd_t pgd)		{ return 0; }
-+static inline int pgd_bad(pgd_t pgd)		{ return 0; }
-+static inline int pgd_present(pgd_t pgd)	{ return 1; }
-+static inline void pgd_clear(pgd_t * pgdp)	{ }
-+
-+#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);
-+
-+#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 virt_to_page(kaddr) \
-+	(phys_mem_map(__pa(kaddr)) + (phys_addr(__pa(kaddr)) >> PAGE_SHIFT))
-+#define pte_pfn(x) phys_to_pfn(pte_val(x))
-+
-+static inline pte_t pte_mknewprot(pte_t pte)
-+{
-+ 	pte_val(pte) |= _PAGE_NEWPROT;
-+	return(pte);
-+}
-+
-+static inline pte_t pte_mknewpage(pte_t pte)
-+{
-+	pte_val(pte) |= _PAGE_NEWPAGE;
-+	return(pte);
-+}
-+
-+static inline void set_pte(pte_t *pteptr, pte_t pteval)
-+{
-+	/* If it's a swap entry, it needs to be marked _PAGE_NEWPAGE so
-+	 * fix_range knows to unmap it.  _PAGE_NEWPROT is specific to
-+	 * mapped pages.
-+	 */
-+	*pteptr = pte_mknewpage(pteval);
-+	if(pte_present(*pteptr)) *pteptr = pte_mknewprot(*pteptr);
-+}
-+
-+/*
-+ * (pmds are folded into pgds so this doesnt get actually called,
-+ * but the define is needed for a generic inline function.)
-+ */
-+#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
-+#define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
-+
-+/*
-+ * The following only work if pte_present() is true.
-+ * Undefined behaviour if not..
-+ */
-+static inline int pte_read(pte_t pte)
-+{ 
-+	return((pte_val(pte) & _PAGE_USER) && 
-+	       !(pte_val(pte) & _PAGE_PROTNONE));
-+}
-+
-+static inline int pte_exec(pte_t pte){
-+	return((pte_val(pte) & _PAGE_USER) &&
-+	       !(pte_val(pte) & _PAGE_PROTNONE));
-+}
-+
-+static inline int pte_write(pte_t pte)
-+{
-+	return((pte_val(pte) & _PAGE_RW) &&
-+	       !(pte_val(pte) & _PAGE_PROTNONE));
-+}
-+
-+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; }
-+static inline int pte_newprot(pte_t pte)
-+{ 
-+	return(pte_present(pte) && (pte_val(pte) & _PAGE_NEWPROT)); 
-+}
-+
-+static inline pte_t pte_rdprotect(pte_t pte)
-+{ 
-+	pte_val(pte) &= ~_PAGE_USER; 
-+	return(pte_mknewprot(pte));
-+}
-+
-+static inline pte_t pte_exprotect(pte_t pte)
-+{ 
-+	pte_val(pte) &= ~_PAGE_USER;
-+	return(pte_mknewprot(pte));
-+}
-+
-+static inline pte_t pte_mkclean(pte_t pte)
-+{
-+	pte_val(pte) &= ~_PAGE_DIRTY; 
-+	return(pte);
-+}
-+
-+static inline pte_t pte_mkold(pte_t pte)	
-+{ 
-+	pte_val(pte) &= ~_PAGE_ACCESSED; 
-+	return(pte);
-+}
-+
-+static inline pte_t pte_wrprotect(pte_t pte)
-+{ 
-+	pte_val(pte) &= ~_PAGE_RW; 
-+	return(pte_mknewprot(pte)); 
-+}
-+
-+static inline pte_t pte_mkread(pte_t pte)
-+{ 
-+	pte_val(pte) |= _PAGE_USER; 
-+	return(pte_mknewprot(pte)); 
-+}
-+
-+static inline pte_t pte_mkexec(pte_t pte)
-+{ 
-+	pte_val(pte) |= _PAGE_USER; 
-+	return(pte_mknewprot(pte)); 
-+}
-+
-+static inline pte_t pte_mkdirty(pte_t pte)
-+{ 
-+	pte_val(pte) |= _PAGE_DIRTY; 
-+	return(pte);
-+}
-+
-+static inline pte_t pte_mkyoung(pte_t pte)
-+{
-+	pte_val(pte) |= _PAGE_ACCESSED; 
-+	return(pte);
-+}
-+
-+static inline pte_t pte_mkwrite(pte_t pte)	
-+{
-+	pte_val(pte) |= _PAGE_RW; 
-+	return(pte_mknewprot(pte)); 
-+}
-+
-+static inline pte_t pte_mkuptodate(pte_t pte)	
-+{
-+	pte_val(pte) &= ~_PAGE_NEWPAGE;
-+	if(pte_present(pte)) pte_val(pte) &= ~_PAGE_NEWPROT;
-+	return(pte); 
-+}
-+
-+extern unsigned long page_to_phys(struct page *page);
-+
-+/*
-+ * Conversion functions: convert a page and protection to a page entry,
-+ * 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;                          \
-+})
-+
-+/* This takes a physical page address that is used by the remapping functions */
-+#define mk_pte_phys(physpage, pgprot) \
-+	pte_mknewpage(mk_pte(phys_page(physpage), pgprot))
-+
-+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-+{
-+	pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
-+	if(pte_present(pte)) pte = pte_mknewpage(pte_mknewprot(pte));
-+	return pte; 
-+}
-+
-+#define pmd_page(pmd) ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
-+
-+/* to find an entry in a page-table-directory. */
-+#define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-+#define __pgd_offset(address) pgd_index(address)
-+
-+/* to find an entry in a page-table-directory */
-+#define pgd_offset(mm, address) \
-+((mm)->pgd + ((address) >> PGDIR_SHIFT))
-+
-+/* to find an entry in a kernel page-table-directory */
-+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-+
-+#define __pmd_offset(address) \
-+		(((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-+
-+/* Find an entry in the second-level page table.. */
-+static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
-+{
-+	return (pmd_t *) dir;
-+}
-+
-+/* Find an entry in the third-level page table.. */ 
-+#define pte_offset(pmd, address) \
-+((pte_t *) (pmd_page(*pmd) + ((address>>10) & ((PTRS_PER_PTE-1)<<2))))
-+
-+#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_ENTRY(type, offset) \
-+	((swp_entry_t) { ((type) << 3) | ((offset) << 10) })
-+#define pte_to_swp_entry(pte) \
-+	((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })
-+#define swp_entry_to_pte(x)		((pte_t) { (x).val })
-+
-+#define PageSkip(x) (0)
-+#define kern_addr_valid(addr) (1)
-+
-+#include <asm-generic/pgtable.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/include/asm-um/poll.h um/include/asm-um/poll.h
---- orig/include/asm-um/poll.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/poll.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_POLL_H
-+#define __UM_POLL_H
-+
-+#include "asm/arch/poll.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/posix_types.h um/include/asm-um/posix_types.h
---- orig/include/asm-um/posix_types.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/posix_types.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_POSIX_TYPES_H
-+#define __UM_POSIX_TYPES_H
-+
-+#include "asm/arch/posix_types.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/processor-generic.h um/include/asm-um/processor-generic.h
---- orig/include/asm-um/processor-generic.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/processor-generic.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,182 @@
-+/* 
-+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PROCESSOR_GENERIC_H
-+#define __UM_PROCESSOR_GENERIC_H
-+
-+struct pt_regs;
-+
-+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
-+
-+struct thread_struct {
-+	int forking;
-+	unsigned long kernel_stack;
-+	int nsyscalls;
-+	struct pt_regs regs;
-+	unsigned long cr2;
-+	int err;
-+	void *fault_addr;
-+	void *fault_catcher;
-+	struct task_struct *prev_sched;
-+	unsigned long temp_stack;
-+	void *exec_buf;
-+	struct arch_thread arch;
-+	union {
-+#ifdef CONFIG_MODE_TT
-+		struct proc_tt_mode tt;
-+#endif
-+#ifdef CONFIG_MODE_SKAS
-+		struct proc_skas_mode skas;
-+#endif
-+	} mode;
-+	struct {
-+		int op;
-+		union {
-+			struct {
-+				int pid;
-+			} fork, exec;
-+			struct {
-+				int (*proc)(void *);
-+				void *arg;
-+			} thread;
-+			struct {
-+				void (*proc)(void *);
-+				void *arg;
-+			} cb;
-+		} u;
-+	} request;
-+};
-+
-+#define INIT_THREAD \
-+{ \
-+	.forking		= 0, \
-+	.kernel_stack		= 0, \
-+	.nsyscalls		= 0, \
-+        .regs		   	= EMPTY_REGS, \
-+	.cr2			= 0, \
-+	.err			= 0, \
-+	.fault_addr		= NULL, \
-+	.prev_sched		= NULL, \
-+	.temp_stack		= 0, \
-+	.exec_buf		= NULL, \
-+	.arch			= INIT_ARCH_THREAD, \
-+	.request		= { 0 } \
-+}
-+
-+#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
-+
-+typedef struct {
-+	unsigned long seg;
-+} mm_segment_t;
-+
-+extern struct task_struct *alloc_task_struct(void);
-+extern void free_task_struct(struct task_struct *task);
-+
-+#define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
-+
-+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 unsigned long thread_saved_pc(struct thread_struct *t);
-+
-+static inline void mm_copy_segments(struct mm_struct *from_mm, 
-+				    struct mm_struct *new_mm)
-+{
-+}
-+
-+static inline void copy_segments(struct task_struct *p, 
-+				 struct mm_struct *new_mm)
-+{
-+}
-+
-+static inline void release_segments(struct mm_struct *mm)
-+{
-+}
-+
-+#define init_task	(init_task_union.task)
-+#define init_stack	(init_task_union.stack)
-+
-+/*
-+ * User space process size: 3GB (default).
-+ */
-+extern unsigned long task_size;
-+
-+#define TASK_SIZE	(task_size)
-+
-+/* This decides where the kernel will search for a free chunk of vm
-+ * space during mmap's.
-+ */
-+#define TASK_UNMAPPED_BASE	(0x40000000)
-+
-+extern void start_thread(struct pt_regs *regs, unsigned long entry, 
-+			 unsigned long stack);
-+
-+struct cpuinfo_um {
-+	unsigned long loops_per_jiffy;
-+	unsigned long *pgd_quick;
-+	unsigned long *pmd_quick;
-+	unsigned long *pte_quick;
-+	unsigned long pgtable_cache_sz;  
-+	int ipi_pipe[2];
-+};
-+
-+extern struct cpuinfo_um boot_cpu_data;
-+
-+#define my_cpu_data		cpu_data[smp_processor_id()]
-+
-+#ifdef CONFIG_SMP
-+extern struct cpuinfo_um cpu_data[];
-+#define current_cpu_data cpu_data[smp_processor_id()]
-+#else
-+#define cpu_data (&boot_cpu_data)
-+#define current_cpu_data boot_cpu_data
-+#endif
-+
-+#define KSTK_EIP(tsk) (PT_REGS_IP(&tsk->thread.regs))
-+#define KSTK_ESP(tsk) (PT_REGS_SP(&tsk->thread.regs))
-+#define get_wchan(p) (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/include/asm-um/processor-i386.h um/include/asm-um/processor-i386.h
---- orig/include/asm-um/processor-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/processor-i386.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,35 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PROCESSOR_I386_H
-+#define __UM_PROCESSOR_I386_H
-+
-+extern int cpu_has_xmm;
-+extern int cpu_has_cmov;
-+
-+struct arch_thread {
-+	unsigned long debugregs[8];
-+	int debugregs_seq;
-+};
-+
-+#define INIT_ARCH_THREAD { .debugregs  		= { [ 0 ... 7 ] = 0 }, \
-+                           .debugregs_seq	= 0 }
-+
-+#include "asm/arch/user.h"
-+
-+#include "asm/processor-generic.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/include/asm-um/processor-ppc.h um/include/asm-um/processor-ppc.h
---- orig/include/asm-um/processor-ppc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/processor-ppc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,15 @@
-+#ifndef __UM_PROCESSOR_PPC_H
-+#define __UM_PROCESSOR_PPC_H
-+
-+#if defined(__ASSEMBLY__)
-+
-+#define CONFIG_ALL_PPC
-+#include "arch/processor.h"
-+
-+#else
-+
-+#include "asm/processor-generic.h"
-+
-+#endif
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/ptrace-generic.h um/include/asm-um/ptrace-generic.h
---- orig/include/asm-um/ptrace-generic.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ptrace-generic.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,74 @@
-+/* 
-+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PTRACE_GENERIC_H
-+#define __UM_PTRACE_GENERIC_H
-+
-+#ifndef __ASSEMBLY__
-+
-+#include "linux/config.h"
-+
-+#include "asm/current.h"
-+
-+#define pt_regs pt_regs_subarch
-+#define show_regs show_regs_subarch
-+
-+#include "asm/arch/ptrace.h"
-+
-+#undef pt_regs
-+#undef show_regs
-+#undef user_mode
-+#undef instruction_pointer
-+
-+#include "sysdep/ptrace.h"
-+#include "skas_ptrace.h"
-+
-+struct pt_regs {
-+	union uml_pt_regs regs;
-+};
-+
-+#define EMPTY_REGS { regs : EMPTY_UML_PT_REGS }
-+
-+#define PT_REGS_IP(r) UPT_IP(&(r)->regs)
-+#define PT_REGS_SP(r) UPT_SP(&(r)->regs)
-+
-+#define PT_REG(r, reg) UPT_REG(&(r)->regs, reg)
-+#define PT_REGS_SET(r, reg, val) UPT_SET(&(r)->regs, reg, val)
-+
-+#define PT_REGS_SET_SYSCALL_RETURN(r, res) \
-+	UPT_SET_SYSCALL_RETURN(&(r)->regs, res)
-+#define PT_REGS_RESTART_SYSCALL(r) UPT_RESTART_SYSCALL(&(r)->regs)
-+
-+#define PT_REGS_SYSCALL_NR(r) UPT_SYSCALL_NR(&(r)->regs)
-+
-+#define PT_REGS_SC(r) UPT_SC(&(r)->regs)
-+
-+struct task_struct;
-+
-+extern unsigned long getreg(struct task_struct *child, int regno);
-+extern int putreg(struct task_struct *child, int regno, unsigned long value);
-+extern int get_fpregs(unsigned long buf, struct task_struct *child);
-+extern int set_fpregs(unsigned long buf, struct task_struct *child);
-+extern int get_fpxregs(unsigned long buf, struct task_struct *child);
-+extern int set_fpxregs(unsigned long buf, struct task_struct *tsk);
-+
-+extern void show_regs(struct pt_regs *regs);
-+
-+#define INIT_TASK_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE)
-+
-+#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/include/asm-um/ptrace-i386.h um/include/asm-um/ptrace-i386.h
---- orig/include/asm-um/ptrace-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ptrace-i386.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,46 @@
-+/* 
-+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_PTRACE_I386_H
-+#define __UM_PTRACE_I386_H
-+
-+#include "sysdep/ptrace.h"
-+#include "asm/ptrace-generic.h"
-+
-+#define PT_REGS_EAX(r) UPT_EAX(&(r)->regs)
-+#define PT_REGS_EBX(r) UPT_EBX(&(r)->regs)
-+#define PT_REGS_ECX(r) UPT_ECX(&(r)->regs)
-+#define PT_REGS_EDX(r) UPT_EDX(&(r)->regs)
-+#define PT_REGS_ESI(r) UPT_ESI(&(r)->regs)
-+#define PT_REGS_EDI(r) UPT_EDI(&(r)->regs)
-+#define PT_REGS_EBP(r) UPT_EBP(&(r)->regs)
-+
-+#define PT_REGS_CS(r) UPT_CS(&(r)->regs)
-+#define PT_REGS_SS(r) UPT_SS(&(r)->regs)
-+#define PT_REGS_DS(r) UPT_DS(&(r)->regs)
-+#define PT_REGS_ES(r) UPT_ES(&(r)->regs)
-+#define PT_REGS_FS(r) UPT_FS(&(r)->regs)
-+#define PT_REGS_GS(r) UPT_GS(&(r)->regs)
-+
-+#define PT_REGS_EFLAGS(r) UPT_EFLAGS(&(r)->regs)
-+
-+#define PT_REGS_ORIG_SYSCALL(r) PT_REGS_EAX(r)
-+#define PT_REGS_SYSCALL_RET(r) PT_REGS_EAX(r)
-+#define PT_FIX_EXEC_STACK(sp) do ; while(0)
-+
-+#define user_mode(r) UPT_IS_USER(&(r)->regs)
-+
-+#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/include/asm-um/resource.h um/include/asm-um/resource.h
---- orig/include/asm-um/resource.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/resource.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_RESOURCE_H
-+#define __UM_RESOURCE_H
-+
-+#include "asm/arch/resource.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/rwlock.h um/include/asm-um/rwlock.h
---- orig/include/asm-um/rwlock.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/rwlock.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_RWLOCK_H
-+#define __UM_RWLOCK_H
-+
-+#include "asm/arch/rwlock.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/rwsem.h um/include/asm-um/rwsem.h
---- orig/include/asm-um/rwsem.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/rwsem.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,10 @@
-+#ifndef __UM_RWSEM_H__
-+#define __UM_RWSEM_H__
-+
-+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
-+#define __builtin_expect(exp,c) (exp)
-+#endif
-+
-+#include "asm/arch/rwsem.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/scatterlist.h um/include/asm-um/scatterlist.h
---- orig/include/asm-um/scatterlist.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/scatterlist.h	2003-02-27 13:21:49.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SCATTERLIST_H
-+#define __UM_SCATTERLIST_H
-+
-+#include "asm/arch/scatterlist.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/segment.h um/include/asm-um/segment.h
---- orig/include/asm-um/segment.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/segment.h	2002-11-01 19:45:34.000000000 -0500
-@@ -0,0 +1,4 @@
-+#ifndef __UM_SEGMENT_H
-+#define __UM_SEGMENT_H
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/semaphore.h um/include/asm-um/semaphore.h
---- orig/include/asm-um/semaphore.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/semaphore.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SEMAPHORE_H
-+#define __UM_SEMAPHORE_H
-+
-+#include "asm/arch/semaphore.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/sembuf.h um/include/asm-um/sembuf.h
---- orig/include/asm-um/sembuf.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/sembuf.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SEMBUF_H
-+#define __UM_SEMBUF_H
-+
-+#include "asm/arch/sembuf.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/serial.h um/include/asm-um/serial.h
---- orig/include/asm-um/serial.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/serial.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SERIAL_H
-+#define __UM_SERIAL_H
-+
-+#include "asm/arch/serial.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/shmbuf.h um/include/asm-um/shmbuf.h
---- orig/include/asm-um/shmbuf.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/shmbuf.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SHMBUF_H
-+#define __UM_SHMBUF_H
-+
-+#include "asm/arch/shmbuf.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/shmparam.h um/include/asm-um/shmparam.h
---- orig/include/asm-um/shmparam.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/shmparam.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SHMPARAM_H
-+#define __UM_SHMPARAM_H
-+
-+#include "asm/arch/shmparam.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-generic.h um/include/asm-um/sigcontext-generic.h
---- orig/include/asm-um/sigcontext-generic.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/sigcontext-generic.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SIGCONTEXT_GENERIC_H
-+#define __UM_SIGCONTEXT_GENERIC_H
-+
-+#include "asm/arch/sigcontext.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-i386.h um/include/asm-um/sigcontext-i386.h
---- orig/include/asm-um/sigcontext-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/sigcontext-i386.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SIGCONTEXT_I386_H
-+#define __UM_SIGCONTEXT_I386_H
-+
-+#include "asm/sigcontext-generic.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/sigcontext-ppc.h um/include/asm-um/sigcontext-ppc.h
---- orig/include/asm-um/sigcontext-ppc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/sigcontext-ppc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,10 @@
-+#ifndef __UM_SIGCONTEXT_PPC_H
-+#define __UM_SIGCONTEXT_PPC_H
-+
-+#define pt_regs sys_pt_regs
-+
-+#include "asm/sigcontext-generic.h"
-+
-+#undef pt_regs
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/siginfo.h um/include/asm-um/siginfo.h
---- orig/include/asm-um/siginfo.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/siginfo.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SIGINFO_H
-+#define __UM_SIGINFO_H
-+
-+#include "asm/arch/siginfo.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/signal.h um/include/asm-um/signal.h
---- orig/include/asm-um/signal.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/signal.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,22 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_SIGNAL_H
-+#define __UM_SIGNAL_H
-+
-+#include "asm/arch/signal.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/include/asm-um/smp.h um/include/asm-um/smp.h
---- orig/include/asm-um/smp.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/smp.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,19 @@
-+#ifndef __UM_SMP_H
-+#define __UM_SMP_H
-+
-+#ifdef CONFIG_SMP
-+
-+#include "linux/config.h"
-+#include "asm/current.h"
-+
-+#define smp_processor_id() (current->processor)
-+#define cpu_logical_map(n) (n)
-+#define cpu_number_map(n) (n)
-+#define PROC_CHANGE_PENALTY	15 /* Pick a number, any number */
-+extern int hard_smp_processor_id(void);
-+extern unsigned long cpu_online_map;
-+#define NO_PROC_ID -1
-+
-+#endif
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/smplock.h um/include/asm-um/smplock.h
---- orig/include/asm-um/smplock.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/smplock.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SMPLOCK_H
-+#define __UM_SMPLOCK_H
-+
-+#include "asm/arch/smplock.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/socket.h um/include/asm-um/socket.h
---- orig/include/asm-um/socket.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/socket.h	2003-02-27 13:20:13.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SOCKET_H
-+#define __UM_SOCKET_H
-+
-+#include "asm/arch/socket.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/sockios.h um/include/asm-um/sockios.h
---- orig/include/asm-um/sockios.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/sockios.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_SOCKIOS_H
-+#define __UM_SOCKIOS_H
-+
-+#include "asm/arch/sockios.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/softirq.h um/include/asm-um/softirq.h
---- orig/include/asm-um/softirq.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/softirq.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,13 @@
-+#ifndef __UM_SOFTIRQ_H
-+#define __UM_SOFTIRQ_H
-+
-+#include "linux/smp.h"
-+#include "asm/system.h"
-+#include "asm/processor.h"
-+
-+/* A gratuitous name change */
-+#define i386_bh_lock um_bh_lock
-+#include "asm/arch/softirq.h"
-+#undef i386_bh_lock
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/spinlock.h um/include/asm-um/spinlock.h
---- orig/include/asm-um/spinlock.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/spinlock.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,10 @@
-+#ifndef __UM_SPINLOCK_H
-+#define __UM_SPINLOCK_H
-+
-+#include "linux/config.h"
-+
-+#ifdef CONFIG_SMP
-+#include "asm/arch/spinlock.h"
-+#endif
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/statfs.h um/include/asm-um/statfs.h
---- orig/include/asm-um/statfs.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/statfs.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef _UM_STATFS_H
-+#define _UM_STATFS_H
-+
-+#include "asm/arch/statfs.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/stat.h um/include/asm-um/stat.h
---- orig/include/asm-um/stat.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/stat.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_STAT_H
-+#define __UM_STAT_H
-+
-+#include "asm/arch/stat.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/string.h um/include/asm-um/string.h
---- orig/include/asm-um/string.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/string.h	2003-02-24 22:52:09.000000000 -0500
-@@ -0,0 +1,7 @@
-+#ifndef __UM_STRING_H
-+#define __UM_STRING_H
-+
-+#include "asm/arch/string.h"
-+#include "asm/archparam.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/system-generic.h um/include/asm-um/system-generic.h
---- orig/include/asm-um/system-generic.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/system-generic.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,50 @@
-+#ifndef __UM_SYSTEM_GENERIC_H
-+#define __UM_SYSTEM_GENERIC_H
-+
-+#include "asm/arch/system.h"
-+
-+#undef prepare_to_switch
-+#undef switch_to
-+#undef __save_flags
-+#undef save_flags
-+#undef __restore_flags
-+#undef restore_flags
-+#undef __cli
-+#undef __sti
-+#undef cli
-+#undef sti
-+#undef local_irq_save
-+#undef local_irq_restore
-+#undef local_irq_disable
-+#undef local_irq_enable
-+
-+#define prepare_to_switch() do ; while(0)
-+
-+void *_switch_to(void *prev, void *next);
-+
-+#define switch_to(prev, next, last) prev = _switch_to(prev, next)
-+
-+extern int get_signals(void);
-+extern int set_signals(int enable);
-+extern void block_signals(void);
-+extern void unblock_signals(void);
-+
-+#define local_irq_save(flags) do { (flags) = set_signals(0); } while(0)
-+
-+#define local_irq_restore(flags) do { set_signals(flags); } while(0)
-+
-+#define local_irq_enable() unblock_signals()
-+#define local_irq_disable() block_signals()
-+
-+#define __sti() unblock_signals()
-+#define sti() unblock_signals()
-+#define __cli() block_signals()
-+#define cli() block_signals()
-+
-+#define __save_flags(x) do { (flags) = get_signals(); } while(0)
-+#define save_flags(x) __save_flags(x)
-+
-+#define __restore_flags(x) local_irq_restore(x)
-+#define restore_flags(x) __restore_flags(x)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/system-i386.h um/include/asm-um/system-i386.h
---- orig/include/asm-um/system-i386.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/system-i386.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,39 @@
-+#ifndef __UM_SYSTEM_I386_H
-+#define __UM_SYSTEM_I386_H
-+
-+#include "asm/system-generic.h"
-+
-+#define __HAVE_ARCH_CMPXCHG 1
-+
-+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
-diff -Naur -X ../exclude-files orig/include/asm-um/system-ppc.h um/include/asm-um/system-ppc.h
---- orig/include/asm-um/system-ppc.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/system-ppc.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,12 @@
-+#ifndef __UM_SYSTEM_PPC_H
-+#define __UM_SYSTEM_PPC_H
-+
-+#define _switch_to _ppc_switch_to
-+
-+#include "asm/arch/system.h"
-+
-+#undef _switch_to
-+ 
-+#include "asm/system-generic.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/termbits.h um/include/asm-um/termbits.h
---- orig/include/asm-um/termbits.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/termbits.h	2002-10-23 21:11:14.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_TERMBITS_H
-+#define __UM_TERMBITS_H
-+
-+#include "asm/arch/termbits.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/termios.h um/include/asm-um/termios.h
---- orig/include/asm-um/termios.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/termios.h	2003-02-27 13:20:13.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef __UM_TERMIOS_H
-+#define __UM_TERMIOS_H
-+
-+#include "asm/arch/termios.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/timex.h um/include/asm-um/timex.h
---- orig/include/asm-um/timex.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/timex.h	2003-05-28 11:02:07.000000000 -0400
-@@ -0,0 +1,18 @@
-+#ifndef __UM_TIMEX_H
-+#define __UM_TIMEX_H
-+
-+#include "linux/time.h"
-+
-+typedef unsigned long cycles_t;
-+
-+#define cacheflush_time (0)
-+
-+static inline cycles_t get_cycles (void)
-+{
-+	return 0;
-+}
-+
-+#define vxtime_lock()		do ; while (0)
-+#define vxtime_unlock()		do ; while (0)
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/tlb.h um/include/asm-um/tlb.h
---- orig/include/asm-um/tlb.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/tlb.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1 @@
-+#include <asm-generic/tlb.h>
-diff -Naur -X ../exclude-files orig/include/asm-um/types.h um/include/asm-um/types.h
---- orig/include/asm-um/types.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/types.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_TYPES_H
-+#define __UM_TYPES_H
-+
-+#include "asm/arch/types.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/uaccess.h um/include/asm-um/uaccess.h
---- orig/include/asm-um/uaccess.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/uaccess.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,97 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __UM_UACCESS_H
-+#define __UM_UACCESS_H
-+
-+#define VERIFY_READ 0
-+#define VERIFY_WRITE 1
-+
-+/*
-+ * The fs value determines whether argument validity checking should be
-+ * performed or not.  If get_fs() == USER_DS, checking is performed, with
-+ * get_fs() == KERNEL_DS, checking is bypassed.
-+ *
-+ * For historical reasons, these macros are grossly misnamed.
-+ */
-+
-+#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
-+
-+#define KERNEL_DS	MAKE_MM_SEG(0xFFFFFFFF)
-+#define USER_DS		MAKE_MM_SEG(TASK_SIZE)
-+
-+#define get_ds()	(KERNEL_DS)
-+#define get_fs()	(current->addr_limit)
-+#define set_fs(x)	(current->addr_limit = (x))
-+
-+#define segment_eq(a, b) ((a).seg == (b).seg)
-+
-+#include "um_uaccess.h"
-+
-+#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
-+
-+#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
-+
-+#define __get_user(x, ptr) \
-+({ \
-+        const __typeof__(ptr) __private_ptr = ptr; \
-+        __typeof__(*(__private_ptr)) __private_val; \
-+        int __private_ret = -EFAULT; \
-+        (x) = 0; \
-+	if (__copy_from_user(&__private_val, (__private_ptr), \
-+	    sizeof(*(__private_ptr))) == 0) {\
-+        	(x) = (__typeof__(*(__private_ptr))) __private_val; \
-+		__private_ret = 0; \
-+	} \
-+        __private_ret; \
-+}) 
-+
-+#define get_user(x, ptr) \
-+({ \
-+        const __typeof__((*ptr)) *private_ptr = (ptr); \
-+        (access_ok(VERIFY_READ, private_ptr, sizeof(*private_ptr)) ? \
-+	 __get_user(x, private_ptr) : ((x) = 0, -EFAULT)); \
-+})
-+
-+#define __put_user(x, ptr) \
-+({ \
-+        __typeof__(ptr) __private_ptr = ptr; \
-+        __typeof__(*(__private_ptr)) __private_val; \
-+        int __private_ret = -EFAULT; \
-+        __private_val = (__typeof__(*(__private_ptr))) (x); \
-+        if (__copy_to_user((__private_ptr), &__private_val, \
-+			   sizeof(*(__private_ptr))) == 0) { \
-+		__private_ret = 0; \
-+	} \
-+        __private_ret; \
-+})
-+
-+#define put_user(x, ptr) \
-+({ \
-+        __typeof__(*(ptr)) *private_ptr = (ptr); \
-+        (access_ok(VERIFY_WRITE, private_ptr, sizeof(*private_ptr)) ? \
-+	 __put_user(x, private_ptr) : -EFAULT); \
-+})
-+
-+#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
-+
-+struct exception_table_entry
-+{
-+        unsigned long insn;
-+	unsigned long fixup;
-+};
-+
-+#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/include/asm-um/ucontext.h um/include/asm-um/ucontext.h
---- orig/include/asm-um/ucontext.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/ucontext.h	2002-12-01 13:20:58.000000000 -0500
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_UM_UCONTEXT_H
-+#define _ASM_UM_UCONTEXT_H
-+
-+#include "asm/arch/ucontext.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/unaligned.h um/include/asm-um/unaligned.h
---- orig/include/asm-um/unaligned.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/unaligned.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_UNALIGNED_H
-+#define __UM_UNALIGNED_H
-+
-+#include "asm/arch/unaligned.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/unistd.h um/include/asm-um/unistd.h
---- orig/include/asm-um/unistd.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/unistd.h	2003-05-28 11:02:08.000000000 -0400
-@@ -0,0 +1,118 @@
-+/* 
-+ * Copyright (C) 2000, 2001  Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef _UM_UNISTD_H_
-+#define _UM_UNISTD_H_
-+
-+#include "linux/resource.h"
-+#include "asm/uaccess.h"
-+
-+extern long sys_open(const char *filename, int flags, int mode);
-+extern long sys_dup(unsigned int fildes);
-+extern long sys_close(unsigned int fd);
-+extern int um_execve(const char *file, char *const argv[], char *const env[]);
-+extern long sys_setsid(void);
-+extern long sys_waitpid(pid_t pid, unsigned int * stat_addr, int options);
-+extern long sys_wait4(pid_t pid,unsigned int *stat_addr, int options, 
-+		      struct rusage *ru);
-+extern long sys_mount(char *dev_name, char *dir_name, char *type, 
-+		      unsigned long flags, void *data);
-+extern long sys_select(int n, fd_set *inp, fd_set *outp, fd_set *exp, 
-+		       struct timeval *tvp);
-+extern long sys_lseek(unsigned int fildes, unsigned long offset, int whence);
-+extern long sys_read(unsigned int fildes, char *buf, int len);
-+extern long sys_write(unsigned int fildes, char *buf, int len);
-+
-+#ifdef __KERNEL_SYSCALLS__
-+
-+#define KERNEL_CALL(ret_t, sys, args...)	\
-+	mm_segment_t fs = get_fs();		\
-+	ret_t ret;				\
-+	set_fs(KERNEL_DS);			\
-+	ret = sys(args);			\
-+	set_fs(fs);				\
-+	return ret;
-+
-+static inline long open(const char *pathname, int flags, int mode) 
-+{
-+	KERNEL_CALL(int, sys_open, pathname, flags, mode)
-+}
-+
-+static inline long dup(unsigned int fd)
-+{
-+	KERNEL_CALL(int, sys_dup, fd);
-+}
-+
-+static inline long close(unsigned int fd)
-+{
-+	KERNEL_CALL(int, sys_close, fd);
-+}
-+
-+static inline int execve(const char *filename, char *const argv[], 
-+			 char *const envp[])
-+{
-+	KERNEL_CALL(int, um_execve, filename, argv, envp);
-+}
-+
-+static inline long waitpid(pid_t pid, unsigned int *status, int options)
-+{
-+	KERNEL_CALL(pid_t, sys_wait4, pid, status, options, NULL)
-+}
-+
-+static inline pid_t wait(int *status)
-+{
-+	KERNEL_CALL(pid_t, sys_wait4, -1, status, 0, NULL)
-+}
-+
-+static inline pid_t setsid(void)
-+{
-+	KERNEL_CALL(pid_t, sys_setsid)
-+}
-+
-+static inline long lseek(unsigned int fd, off_t offset, unsigned int whence)
-+{
-+	KERNEL_CALL(long, sys_lseek, fd, offset, whence)
-+}
-+
-+static inline int read(unsigned int fd, char * buf, int len)
-+{
-+	KERNEL_CALL(int, sys_read, fd, buf, len)
-+}
-+
-+static inline int write(unsigned int fd, char * buf, int len)
-+{
-+	KERNEL_CALL(int, sys_write, fd, buf, len)
-+}
-+
-+#endif
-+
-+/* Save the value of __KERNEL_SYSCALLS__, undefine it, include the underlying
-+ * arch's unistd.h for the system call numbers, and restore the old 
-+ * __KERNEL_SYSCALLS__.
-+ */
-+
-+#ifdef __KERNEL_SYSCALLS__
-+#define __SAVE_KERNEL_SYSCALLS__ __KERNEL_SYSCALLS__
-+#endif
-+
-+#undef __KERNEL_SYSCALLS__
-+#include "asm/arch/unistd.h"
-+
-+#ifdef __KERNEL_SYSCALLS__
-+#define __KERNEL_SYSCALLS__ __SAVE_KERNEL_SYSCALLS__
-+#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/include/asm-um/user.h um/include/asm-um/user.h
---- orig/include/asm-um/user.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/user.h	2003-05-28 11:04:47.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_USER_H
-+#define __UM_USER_H
-+
-+#include "asm/arch/user.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/vga.h um/include/asm-um/vga.h
---- orig/include/asm-um/vga.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/vga.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_VGA_H
-+#define __UM_VGA_H
-+
-+#include "asm/arch/vga.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/asm-um/xor.h um/include/asm-um/xor.h
---- orig/include/asm-um/xor.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/asm-um/xor.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,6 @@
-+#ifndef __UM_XOR_H
-+#define __UM_XOR_H
-+
-+#include "asm-generic/xor.h"
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/linux/blk.h um/include/linux/blk.h
---- orig/include/linux/blk.h	2002-09-15 12:13:19.000000000 -0400
-+++ um/include/linux/blk.h	2003-05-28 11:02:34.000000000 -0400
-@@ -320,6 +320,15 @@
- #define DEVICE_REQUEST do_ida_request
- #define DEVICE_NR(device) (MINOR(device) >> 4)
- 
-+#elif (MAJOR_NR == UBD_MAJOR)
-+
-+#define DEVICE_NAME "User-mode block device"
-+#define DEVICE_INTR do_ubd
-+#define DEVICE_REQUEST do_ubd_request
-+#define DEVICE_NR(device) (MINOR(device) >> UBD_SHIFT)
-+#define DEVICE_ON(device)
-+#define DEVICE_OFF(device)
-+
- #endif /* MAJOR_NR == whatever */
- 
- /* provide DEVICE_xxx defaults, if not explicitly defined
-diff -Naur -X ../exclude-files orig/include/linux/fs.h um/include/linux/fs.h
---- orig/include/linux/fs.h	2003-02-27 13:04:27.000000000 -0500
-+++ um/include/linux/fs.h	2003-05-28 11:02:07.000000000 -0400
-@@ -318,6 +318,8 @@
- #include <linux/ncp_fs_i.h>
- #include <linux/proc_fs_i.h>
- #include <linux/usbdev_fs_i.h>
-+#include <linux/hostfs_fs_i.h>
-+#include <linux/hppfs_fs_i.h>
- #include <linux/jffs2_fs_i.h>
- #include <linux/cramfs_fs_sb.h>
- 
-@@ -509,7 +511,9 @@
- 		struct proc_inode_info		proc_i;
- 		struct socket			socket_i;
- 		struct usbdev_inode_info        usbdev_i;
--		struct jffs2_inode_info		jffs2_i;
-+	        struct hostfs_inode_info	hostfs_i;
-+	        struct hppfs_inode_info		hppfs_i;
-+ 		struct jffs2_inode_info		jffs2_i;
- 		void				*generic_ip;
- 	} u;
- };
-diff -Naur -X ../exclude-files orig/include/linux/hostfs_fs_i.h um/include/linux/hostfs_fs_i.h
---- orig/include/linux/hostfs_fs_i.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/linux/hostfs_fs_i.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,21 @@
-+#ifndef _HOSTFS_FS_I
-+#define _HOSTFS_FS_I
-+
-+struct hostfs_inode_info {
-+	char *host_filename;
-+	int fd;
-+	int mode;
-+};
-+
-+#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/include/linux/hppfs_fs_i.h um/include/linux/hppfs_fs_i.h
---- orig/include/linux/hppfs_fs_i.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/linux/hppfs_fs_i.h	2002-10-23 21:08:05.000000000 -0400
-@@ -0,0 +1,19 @@
-+#ifndef _HPPFS_FS_I
-+#define _HPPFS_FS_I
-+
-+struct hppfs_inode_info {
-+	struct dentry *proc_dentry;
-+};
-+
-+#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/include/linux/kernel.h um/include/linux/kernel.h
---- orig/include/linux/kernel.h	2003-02-27 13:04:27.000000000 -0500
-+++ um/include/linux/kernel.h	2003-05-28 11:02:07.000000000 -0400
-@@ -49,7 +49,7 @@
- # define ATTRIB_NORET  __attribute__((noreturn))
- # define NORET_AND     noreturn,
- 
--#ifdef __i386__
-+#if defined(__i386__) || defined(UM_FASTCALL)
- #define FASTCALL(x)	x __attribute__((regparm(3)))
- #else
- #define FASTCALL(x)	x
-diff -Naur -X ../exclude-files orig/include/linux/kernel_stat.h um/include/linux/kernel_stat.h
---- orig/include/linux/kernel_stat.h	2003-02-27 13:04:27.000000000 -0500
-+++ um/include/linux/kernel_stat.h	2003-05-28 11:02:07.000000000 -0400
-@@ -12,7 +12,7 @@
-  * used by rstatd/perfmeter
-  */
- 
--#define DK_MAX_MAJOR 16
-+#define DK_MAX_MAJOR 99
- #define DK_MAX_DISK 16
- 
- struct kernel_stat {
-diff -Naur -X ../exclude-files orig/include/linux/mm.h um/include/linux/mm.h
---- orig/include/linux/mm.h	2002-09-15 12:13:19.000000000 -0400
-+++ um/include/linux/mm.h	2003-05-28 11:02:07.000000000 -0400
-@@ -425,6 +425,14 @@
- extern struct page * FASTCALL(__alloc_pages(unsigned int gfp_mask, unsigned int order, zonelist_t *zonelist));
- extern struct page * alloc_pages_node(int nid, unsigned int gfp_mask, unsigned int order);
- 
-+#ifndef HAVE_ARCH_VALIDATE
-+static inline struct page *arch_validate(struct page *page, 
-+					 unsigned int gfp_mask, int order)
-+{
-+        return(page);
-+}
-+#endif
-+
- static inline struct page * alloc_pages(unsigned int gfp_mask, unsigned int order)
- {
- 	/*
-@@ -432,7 +440,7 @@
- 	 */
- 	if (order >= MAX_ORDER)
- 		return NULL;
--	return _alloc_pages(gfp_mask, order);
-+	return arch_validate(_alloc_pages(gfp_mask, order), gfp_mask, order);
- }
- 
- #define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)
-@@ -492,6 +500,9 @@
- int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
- 		int len, int write, int force, struct page **pages, struct vm_area_struct **vmas);
- 
-+extern long do_mprotect(struct mm_struct *mm, unsigned long start, 
-+			size_t len, unsigned long prot);
-+
- /*
-  * On a two-level page table, this ends up being trivial. Thus the
-  * inlining and the symmetry break with pte_alloc() that does all
-@@ -539,9 +550,10 @@
- 
- extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
- 
--extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
--	unsigned long len, unsigned long prot,
--	unsigned long flag, unsigned long pgoff);
-+extern unsigned long do_mmap_pgoff(struct mm_struct *mm, struct file *file, 
-+				   unsigned long addr, unsigned long len,
-+				   unsigned long prot, unsigned long flag,
-+				   unsigned long pgoff);
- 
- static inline unsigned long do_mmap(struct file *file, unsigned long addr,
- 	unsigned long len, unsigned long prot,
-@@ -551,7 +563,8 @@
- 	if ((offset + PAGE_ALIGN(len)) < offset)
- 		goto out;
- 	if (!(offset & ~PAGE_MASK))
--		ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
-+		ret = do_mmap_pgoff(current->mm, file, addr, len, prot, flag, 
-+				    offset >> PAGE_SHIFT);
- out:
- 	return ret;
- }
-diff -Naur -X ../exclude-files orig/include/linux/proc_mm.h um/include/linux/proc_mm.h
---- orig/include/linux/proc_mm.h	1969-12-31 19:00:00.000000000 -0500
-+++ um/include/linux/proc_mm.h	2003-05-28 11:03:43.000000000 -0400
-@@ -0,0 +1,48 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#ifndef __PROC_MM_H
-+#define __PROC_MM_H
-+
-+#include "linux/sched.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;
-+};
-+
-+extern struct mm_struct *proc_mm_get_mm(int fd);
-+
-+#endif
-diff -Naur -X ../exclude-files orig/include/linux/tty.h um/include/linux/tty.h
---- orig/include/linux/tty.h	2003-02-27 13:04:28.000000000 -0500
-+++ um/include/linux/tty.h	2003-05-28 11:02:07.000000000 -0400
-@@ -309,6 +309,9 @@
- 	spinlock_t read_lock;
- 	/* If the tty has a pending do_SAK, queue it here - akpm */
- 	struct tq_struct SAK_tq;
-+#ifdef CONFIG_TTY_LOG
-+        int log_fd;
-+#endif
- };
- 
- /* tty magic number */
-@@ -366,6 +369,7 @@
- extern int specialix_init(void);
- extern int espserial_init(void);
- extern int macserial_init(void);
-+extern int stdio_init(void);
- extern int a2232board_init(void);
- 
- extern int tty_paranoia_check(struct tty_struct *tty, kdev_t device,
-@@ -421,5 +425,7 @@
- extern int vt_ioctl(struct tty_struct *tty, struct file * file,
- 		    unsigned int cmd, unsigned long arg);
- 
-+extern void stdio_console_init(void);
-+
- #endif /* __KERNEL__ */
- #endif
-diff -Naur -X ../exclude-files orig/init/do_mounts.c um/init/do_mounts.c
---- orig/init/do_mounts.c	2003-02-27 13:04:28.000000000 -0500
-+++ um/init/do_mounts.c	2003-02-27 13:05:27.000000000 -0500
-@@ -153,6 +153,22 @@
- 	{ "pf",		0x2f00 },
- 	{ "apblock", APBLOCK_MAJOR << 8},
- 	{ "ddv", DDV_MAJOR << 8},
-+	{ "ubd0", UBD_MAJOR << 8 | 0 << 4},
-+	{ "ubda", UBD_MAJOR << 8 | 0 << 4},
-+	{ "ubd1", UBD_MAJOR << 8 | 1 << 4},
-+	{ "ubdb", UBD_MAJOR << 8 | 1 << 4},
-+	{ "ubd2", UBD_MAJOR << 8 | 2 << 4},
-+	{ "ubdc", UBD_MAJOR << 8 | 2 << 4},
-+	{ "ubd3", UBD_MAJOR << 8 | 3 << 4},
-+	{ "ubdd", UBD_MAJOR << 8 | 3 << 4},
-+	{ "ubd4", UBD_MAJOR << 8 | 4 << 4},
-+	{ "ubde", UBD_MAJOR << 8 | 4 << 4},
-+	{ "ubd5", UBD_MAJOR << 8 | 5 << 4},
-+	{ "ubdf", UBD_MAJOR << 8 | 5 << 4},
-+	{ "ubd6", UBD_MAJOR << 8 | 6 << 4},
-+	{ "ubdg", UBD_MAJOR << 8 | 6 << 4},
-+	{ "ubd7", UBD_MAJOR << 8 | 7 << 4},
-+	{ "ubdh", UBD_MAJOR << 8 | 7 << 4},
- 	{ "jsfd",    JSFD_MAJOR << 8},
- #if defined(CONFIG_ARCH_S390)
- 	{ "dasda", (DASD_MAJOR << MINORBITS) },
-diff -Naur -X ../exclude-files orig/kernel/panic.c um/kernel/panic.c
---- orig/kernel/panic.c	2003-02-27 13:04:29.000000000 -0500
-+++ um/kernel/panic.c	2003-02-27 13:05:27.000000000 -0500
-@@ -66,7 +66,7 @@
- 	smp_send_stop();
- #endif
- 
--	notifier_call_chain(&panic_notifier_list, 0, NULL);
-+	notifier_call_chain(&panic_notifier_list, 0, buf);
- 
- 	if (panic_timeout > 0)
- 	{
-diff -Naur -X ../exclude-files orig/MAINTAINERS um/MAINTAINERS
---- orig/MAINTAINERS	2003-02-27 13:04:12.000000000 -0500
-+++ um/MAINTAINERS	2003-02-27 13:05:17.000000000 -0500
-@@ -1841,6 +1841,14 @@
- L:	linux-usb-devel@lists.sourceforge.net
- W:	http://usb.in.tum.de
- S:	Maintained
-+
-+USER-MODE PORT
-+P:	Jeff Dike
-+M:	jdike@karaya.com
-+L:	user-mode-linux-devel@lists.sourceforge.net
-+L:	user-mode-linux-user@lists.sourceforge.net
-+W:	http://user-mode-linux.sourceforge.net
-+S:	Maintained
- 	
- USB "USBNET" DRIVER
- P:	David Brownell
-diff -Naur -X ../exclude-files orig/Makefile um/Makefile
---- orig/Makefile	2003-02-27 13:04:12.000000000 -0500
-+++ um/Makefile	2003-02-27 13:05:17.000000000 -0500
-@@ -5,7 +5,15 @@
- 
- KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
- 
--ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
-+# SUBARCH tells the usermode build what the underlying arch is.  That is set
-+# first, and if a usermode build is happening, the "ARCH=um" on the command
-+# line overrides the setting of ARCH below.  If a native build is happening,
-+# then ARCH is assigned, getting whatever value it gets normally, and 
-+# SUBARCH is subsequently ignored.
-+
-+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
-+ARCH := $(SUBARCH)
-+
- KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
- 
- CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
-diff -Naur -X ../exclude-files orig/mm/Makefile um/mm/Makefile
---- orig/mm/Makefile	2002-08-21 11:47:43.000000000 -0400
-+++ um/mm/Makefile	2002-11-08 14:21:36.000000000 -0500
-@@ -17,5 +17,6 @@
- 	    shmem.o
- 
- obj-$(CONFIG_HIGHMEM) += highmem.o
-+obj-$(CONFIG_PROC_MM) += proc_mm.o
- 
- include $(TOPDIR)/Rules.make
-diff -Naur -X ../exclude-files orig/mm/mmap.c um/mm/mmap.c
---- orig/mm/mmap.c	2003-02-27 13:04:29.000000000 -0500
-+++ um/mm/mmap.c	2003-02-27 13:05:27.000000000 -0500
-@@ -390,10 +390,11 @@
- 	return 0;
- }
- 
--unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, unsigned long len,
--	unsigned long prot, unsigned long flags, unsigned long pgoff)
-+unsigned long do_mmap_pgoff(struct mm_struct *mm, struct file * file, 
-+			    unsigned long addr, unsigned long len,
-+			    unsigned long prot, unsigned long flags, 
-+			    unsigned long pgoff)
- {
--	struct mm_struct * mm = current->mm;
- 	struct vm_area_struct * vma, * prev;
- 	unsigned int vm_flags;
- 	int correct_wcount = 0;
-diff -Naur -X ../exclude-files orig/mm/mprotect.c um/mm/mprotect.c
---- orig/mm/mprotect.c	2002-08-21 11:47:43.000000000 -0400
-+++ um/mm/mprotect.c	2002-11-10 20:24:32.000000000 -0500
-@@ -264,7 +264,8 @@
- 	return 0;
- }
- 
--asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot)
-+long do_mprotect(struct mm_struct *mm, unsigned long start, size_t len, 
-+		 unsigned long prot)
- {
- 	unsigned long nstart, end, tmp;
- 	struct vm_area_struct * vma, * next, * prev;
-@@ -281,9 +282,9 @@
- 	if (end == start)
- 		return 0;
- 
--	down_write(&current->mm->mmap_sem);
-+	down_write(&mm->mmap_sem);
- 
--	vma = find_vma_prev(current->mm, start, &prev);
-+	vma = find_vma_prev(mm, start, &prev);
- 	error = -ENOMEM;
- 	if (!vma || vma->vm_start > start)
- 		goto out;
-@@ -332,6 +333,11 @@
- 		prev->vm_mm->map_count--;
- 	}
- out:
--	up_write(&current->mm->mmap_sem);
-+	up_write(&mm->mmap_sem);
- 	return error;
- }
-+
-+asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot)
-+{
-+        return(do_mprotect(current->mm, start, len, prot));
-+}
-diff -Naur -X ../exclude-files orig/mm/proc_mm.c um/mm/proc_mm.c
---- orig/mm/proc_mm.c	1969-12-31 19:00:00.000000000 -0500
-+++ um/mm/proc_mm.c	2002-11-19 14:20:26.000000000 -0500
-@@ -0,0 +1,173 @@
-+/* 
-+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
-+ * Licensed under the GPL
-+ */
-+
-+#include "linux/init.h"
-+#include "linux/proc_fs.h"
-+#include "linux/proc_mm.h"
-+#include "linux/file.h"
-+#include "asm/uaccess.h"
-+#include "asm/mmu_context.h"
-+
-+static struct file_operations proc_mm_fops;
-+
-+struct mm_struct *proc_mm_get_mm(int fd)
-+{
-+	struct mm_struct *ret = ERR_PTR(-EBADF);
-+	struct file *file;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	ret = ERR_PTR(-EINVAL);
-+	if(file->f_op != &proc_mm_fops)
-+		goto out_fput;
-+
-+	ret = file->private_data;
-+ out_fput:
-+	fput(file);
-+ out:
-+	return(ret);
-+}
-+
-+extern 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);
-+
-+static ssize_t write_proc_mm(struct file *file, const char *buffer,
-+			     size_t count, loff_t *ppos)
-+{
-+	struct mm_struct *mm = file->private_data;
-+	struct proc_mm_op req;
-+	int n, ret;
-+
-+	if(count > sizeof(req))
-+		return(-EINVAL);
-+
-+	n = copy_from_user(&req, buffer, count);
-+	if(n != 0)
-+		return(-EFAULT);
-+
-+	ret = count;
-+	switch(req.op){
-+	case MM_MMAP: {
-+		struct mm_mmap *map = &req.u.mmap;
-+
-+		ret = do_mmap2(mm, map->addr, map->len, map->prot, 
-+			       map->flags, map->fd, map->offset >> PAGE_SHIFT);
-+		if((ret & ~PAGE_MASK) == 0)
-+			ret = count;
-+	
-+		break;
-+	}
-+	case MM_MUNMAP: {
-+		struct mm_munmap *unmap = &req.u.munmap;
-+
-+		down_write(&mm->mmap_sem);
-+		ret = do_munmap(mm, unmap->addr, unmap->len);
-+		up_write(&mm->mmap_sem);
-+
-+		if(ret == 0)
-+			ret = count;
-+		break;
-+	}
-+	case MM_MPROTECT: {
-+		struct mm_mprotect *protect = &req.u.mprotect;
-+
-+		ret = do_mprotect(mm, protect->addr, protect->len, 
-+				  protect->prot);
-+		if(ret == 0)
-+			ret = count;
-+		break;
-+	}
-+
-+	case MM_COPY_SEGMENTS: {
-+		struct mm_struct *from = proc_mm_get_mm(req.u.copy_segments);
-+
-+		if(IS_ERR(from)){
-+			ret = PTR_ERR(from);
-+			break;
-+		}
-+
-+		mm_copy_segments(from, mm);
-+		break;
-+	}
-+	default:
-+		ret = -EINVAL;
-+		break;
-+	}
-+
-+	return(ret);
-+}
-+
-+static int open_proc_mm(struct inode *inode, struct file *file)
-+{
-+	struct mm_struct *mm = mm_alloc();
-+	int ret;
-+
-+	ret = -ENOMEM;
-+	if(mm == NULL)
-+		goto out_mem;
-+
-+	ret = init_new_context(current, mm);
-+	if(ret)
-+		goto out_free;
-+
-+	spin_lock(&mmlist_lock);
-+	list_add(&mm->mmlist, &current->mm->mmlist);
-+	mmlist_nr++;
-+	spin_unlock(&mmlist_lock);
-+
-+	file->private_data = mm;
-+
-+	return(0);
-+
-+ out_free:
-+	mmput(mm);
-+ out_mem:
-+	return(ret);
-+}
-+
-+static int release_proc_mm(struct inode *inode, struct file *file)
-+{
-+	struct mm_struct *mm = file->private_data;
-+
-+	mmput(mm);
-+	return(0);
-+}
-+
-+static struct file_operations proc_mm_fops = {
-+	.open		= open_proc_mm,
-+	.release	= release_proc_mm,
-+	.write		= write_proc_mm,
-+};
-+
-+static int make_proc_mm(void)
-+{
-+	struct proc_dir_entry *ent;
-+
-+	ent = create_proc_entry("mm", 0222, &proc_root);
-+	if(ent == NULL){
-+		printk("make_proc_mm : Failed to register /proc/mm\n");
-+		return(0);
-+	}
-+	ent->proc_fops = &proc_mm_fops;
-+
-+	return(0);
-+}
-+
-+__initcall(make_proc_mm);
-+
-+/*
-+ * 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/mm/slab.c um/mm/slab.c
---- orig/mm/slab.c	2003-02-27 13:04:29.000000000 -0500
-+++ um/mm/slab.c	2003-02-27 13:05:27.000000000 -0500
-@@ -1946,10 +1946,14 @@
- 
- 	name = cachep->name; 
- 	{
-+        mm_segment_t fs;
- 	char tmp; 
-+	fs = get_fs();
-+	set_fs(KERNEL_DS);
- 	if (__get_user(tmp, name)) 
- 		name = "broken"; 
--	}       
-+	set_fs(fs);
-+	}
- 
- 	seq_printf(m, "%-17s %6lu %6lu %6u %4lu %4lu %4u",
- 		name, active_objs, num_objs, cachep->objsize,
diff --git a/lustre/kernel_patches/patches/uml_check_get_page.patch b/lustre/kernel_patches/patches/uml_check_get_page.patch
deleted file mode 100644
index 228d0863e7..0000000000
--- a/lustre/kernel_patches/patches/uml_check_get_page.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- arch/um/kernel/mem.c |   15 +++++++++++++++
- 1 files changed, 15 insertions(+)
-
---- linux-2.4.20/arch/um/kernel/mem.c~uml_check_get_page	2003-04-08 23:34:50.000000000 -0600
-+++ linux-2.4.20-braam/arch/um/kernel/mem.c	2003-04-08 23:34:50.000000000 -0600
-@@ -712,6 +712,21 @@ struct page *pte_mem_map(pte_t pte)
- 	return(phys_mem_map(pte_val(pte)));
- }
- 
-+struct page *check_get_page(unsigned long kaddr)
-+{
-+	struct page *page;
-+	struct mem_region *mr;
-+	unsigned long phys = __pa(kaddr);
-+	unsigned int n = phys_region_index(phys);
-+
-+	if (regions[n] == NULL)
-+                return NULL;
-+
-+	mr = regions[n];
-+	page = (struct page *) mr->mem_map;
-+	return page + ((phys_addr(phys)) >> PAGE_SHIFT);
-+}
-+
- struct mem_region *page_region(struct page *page, int *index_out)
- {
- 	int i;
-
-_
diff --git a/lustre/kernel_patches/patches/uml_get_kmem_end_export.patch b/lustre/kernel_patches/patches/uml_get_kmem_end_export.patch
deleted file mode 100644
index 1637a65b59..0000000000
--- a/lustre/kernel_patches/patches/uml_get_kmem_end_export.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- uml-2.4/arch/um/kernel/ksyms.c.orig	2003-12-12 18:16:28.000000000 +0200
-+++ uml-2.4/arch/um/kernel/ksyms.c	2003-12-12 18:16:39.000000000 +0200
-@@ -33,6 +33,7 @@
- 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);
diff --git a/lustre/kernel_patches/patches/uml_no_panic.patch b/lustre/kernel_patches/patches/uml_no_panic.patch
deleted file mode 100644
index 6b173257f5..0000000000
--- a/lustre/kernel_patches/patches/uml_no_panic.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- arch/um/kernel/mem.c |    8 ++++++--
- 1 files changed, 6 insertions(+), 2 deletions(-)
-
---- linux-2.4.20/arch/um/kernel/mem.c~uml_no_panic	2003-04-08 23:34:57.000000000 -0600
-+++ linux-2.4.20-braam/arch/um/kernel/mem.c	2003-04-08 23:34:57.000000000 -0600
-@@ -742,7 +742,9 @@ struct mem_region *page_region(struct pa
- 			return(region);
- 		}
- 	}
--	panic("No region found for page");
-+//	panic("No region found for page");
-+	printk(KERN_ERR "no region found for page %p\n, returning NULL\n", 
-+			page);
- 	return(NULL);
- }
- 
-@@ -814,7 +816,9 @@ extern unsigned long region_pa(void *vir
- 		   (addr <= region->start + region->len))
- 			return(mk_phys(addr - region->start, i));
- 	}
--	panic("region_pa : no region for virtual address");
-+	//panic("region_pa : no region for virtual address");
-+	printk(KERN_ERR "no region for virtual address %lu, return pa 0\n",
-+			addr);
- 	return(0);
- }
- 
-
-_
diff --git a/lustre/kernel_patches/patches/vfs-pdirops-2.4.20.patch b/lustre/kernel_patches/patches/vfs-pdirops-2.4.20.patch
deleted file mode 100644
index 135f94dc90..0000000000
--- a/lustre/kernel_patches/patches/vfs-pdirops-2.4.20.patch
+++ /dev/null
@@ -1,269 +0,0 @@
- fs/inode.c         |    1 
- fs/namei.c         |   66 ++++++++++++++++++++++++++++++++++++++---------------
- include/linux/fs.h |   11 ++++----
- 3 files changed, 54 insertions(+), 24 deletions(-)
-
-Index: linux-2.4.20-rh/fs/namei.c
-===================================================================
---- linux-2.4.20-rh.orig/fs/namei.c	2003-09-04 20:58:33.000000000 +0800
-+++ linux-2.4.20-rh/fs/namei.c	2003-09-04 21:21:20.000000000 +0800
-@@ -101,6 +101,36 @@
- 
- }
- 
-+static void *lock_dir(struct inode *dir, struct qstr *name)
-+{
-+	unsigned long hash;
-+	
-+	if (!IS_PDIROPS(dir)) {
-+		down(&dir->i_sem);
-+		return 0;
-+	}
-+
-+	/* OK. fs understands parallel directory operations.
-+	 * so, we try to acquire lock for hash of requested
-+	 * filename in order to prevent any operations with
-+	 * same name in same time -bzzz */
-+
-+	/* calculate name hash */
-+	hash = full_name_hash(name->name, name->len);
-+
-+	/* lock this hash */
-+	return dynlock_lock(&dir->i_dcache_lock, hash, 1, GFP_ATOMIC);
-+}
-+
-+static void unlock_dir(struct inode *dir, void *lock)
-+{
-+	if (!IS_PDIROPS(dir)) {
-+		up(&dir->i_sem);
-+		return;
-+	}
-+	dynlock_unlock(&dir->i_dcache_lock, lock);
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -303,10 +333,11 @@
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
- 	int counter = 0;
-+	void *lock;
- 
- again:
- 	counter++;
--	down(&dir->i_sem);
-+	lock = lock_dir(dir, name);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
- 	 * while we waited for the directory semaphore..
-@@ -329,7 +359,7 @@
- 			else
- 				result = dentry;
- 		}
--		up(&dir->i_sem);
-+		unlock_dir(dir, lock);
- 		return result;
- 	}
- 
-@@ -337,7 +367,7 @@
- 	 * Uhhuh! Nasty case: the cache was re-populated while
- 	 * we waited on the semaphore. Need to revalidate.
- 	 */
--	up(&dir->i_sem);
-+	unlock_dir(dir, lock);
- 	if (result->d_op && result->d_op->d_revalidate) {
- 		if (!result->d_op->d_revalidate(result, flags) && !d_invalidate(result)) {
- 			dput(result);
-@@ -1180,13 +1210,13 @@
- 		goto exit;
- 
- 	dir = nd->dentry;
--	down(&dir->d_inode->i_sem);
-+	nd->lock = lock_dir(dir->d_inode, &nd->last);
- 	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
- 	if (IS_ERR(dentry)) {
--		up(&dir->d_inode->i_sem);
-+		unlock_dir(dir->d_inode, nd->lock);
- 		goto exit;
- 	}
- 
-@@ -1195,7 +1225,7 @@
- 	if (!dentry->d_inode) {
- 		error = vfs_create_it(dir->d_inode, dentry,
- 				   mode & ~current->fs->umask, it);
--		up(&dir->d_inode->i_sem);
-+		unlock_dir(dir->d_inode, nd->lock);		
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
- 		if (error)
-@@ -1209,7 +1239,7 @@
- 	/*
- 	 * It already exists.
- 	 */
--	up(&dir->d_inode->i_sem);
-+	unlock_dir(dir->d_inode, nd->lock);
- 
- 	error = -EEXIST;
- 	if (flag & O_EXCL)
-@@ -1362,7 +1392,7 @@
- 		goto exit;
- 	}
- 	dir = nd->dentry;
--	down(&dir->d_inode->i_sem);
-+	nd->lock = lock_dir(dir->d_inode, &nd->last);
- 	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
-@@ -1380,7 +1410,7 @@
- {
- 	struct dentry *dentry;
- 
--	down(&nd->dentry->d_inode->i_sem);
-+	nd->lock = lock_dir(nd->dentry->d_inode, &nd->last);
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
-@@ -1469,7 +1499,7 @@
- 		}
- 		dput(dentry);
- 	}
--	up(&nd.dentry->d_inode->i_sem);
-+	unlock_dir(nd.dentry->d_inode, nd.lock);
- out2:
- 	path_release(&nd);
- out:
-@@ -1532,7 +1562,7 @@
- 					  mode & ~current->fs->umask);
- 			dput(dentry);
- 		}
--		up(&nd.dentry->d_inode->i_sem);
-+		unlock_dir(nd.dentry->d_inode, nd.lock);
- out2:
- 		path_release(&nd);
- out:
-@@ -1642,14 +1672,14 @@
- 		if (error != -EOPNOTSUPP)
- 			goto exit1;
- 	}
--	down(&nd.dentry->d_inode->i_sem);
-+	nd.lock = lock_dir(nd.dentry->d_inode, &nd.last);
- 	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
- 		dput(dentry);
- 	}
--	up(&nd.dentry->d_inode->i_sem);
-+	unlock_dir(nd.dentry->d_inode, nd.lock);
- exit1:
- 	path_release(&nd);
- exit:
-@@ -1708,7 +1738,7 @@
- 		if (error != -EOPNOTSUPP)
- 			goto exit1;
- 	}
--	down(&nd.dentry->d_inode->i_sem);
-+	nd.lock = lock_dir(nd.dentry->d_inode, &nd.last);
- 	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
-@@ -1719,7 +1749,7 @@
- 	exit2:
- 		dput(dentry);
- 	}
--	up(&nd.dentry->d_inode->i_sem);
-+	unlock_dir(nd.dentry->d_inode, nd.lock);
- exit1:
- 	path_release(&nd);
- exit:
-@@ -1789,7 +1819,7 @@
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
--		up(&nd.dentry->d_inode->i_sem);
-+		unlock_dir(nd.dentry->d_inode, nd.lock);
- 	out2:
- 		path_release(&nd);
- 	out:
-@@ -1881,7 +1911,7 @@
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
- 			dput(new_dentry);
- 		}
--		up(&nd.dentry->d_inode->i_sem);
-+		unlock_dir(nd.dentry->d_inode, nd.lock);
- out_release:
- 		path_release(&nd);
- out:
-Index: linux-2.4.20-rh/include/linux/fs.h
-===================================================================
---- linux-2.4.20-rh.orig/include/linux/fs.h	2003-09-04 20:59:14.000000000 +0800
-+++ linux-2.4.20-rh/include/linux/fs.h	2003-09-04 21:03:46.000000000 +0800
-@@ -21,6 +21,7 @@
- #include <linux/cache.h>
- #include <linux/stddef.h>
- #include <linux/string.h>
-+#include <linux/dynlocks.h>
- 
- #include <asm/atomic.h>
- #include <asm/bitops.h>
-@@ -136,6 +137,7 @@
- #define S_IMMUTABLE	16	/* Immutable file */
- #define S_DEAD		32	/* removed, but still open directory */
- #define S_NOQUOTA	64	/* Inode is not counted to quota */
-+#define S_PDIROPS	256	/* Parallel directory operations */
- 
- /*
-  * Note that nosuid etc flags are inode-specific: setting some file-system
-@@ -162,6 +164,7 @@
- #define IS_IMMUTABLE(inode)	((inode)->i_flags & S_IMMUTABLE)
- #define IS_NOATIME(inode)	(__IS_FLG(inode, MS_NOATIME) || ((inode)->i_flags & S_NOATIME))
- #define IS_NODIRATIME(inode)	__IS_FLG(inode, MS_NODIRATIME)
-+#define IS_PDIROPS(inode)	__IS_FLG(inode, S_PDIROPS)
- 
- #define IS_DEADDIR(inode)	((inode)->i_flags & S_DEAD)
- 
-@@ -489,6 +492,7 @@
- 	atomic_t		i_writecount;
- 	unsigned int		i_attr_flags;
- 	__u32			i_generation;
-+	struct dynlock		i_dcache_lock;	/* for parallel directory ops */
- 	union {
- 		struct minix_inode_info		minix_i;
- 		struct ext2_inode_info		ext2_i;
-@@ -708,6 +712,7 @@
- 	unsigned int flags;
- 	int last_type;
- 	struct lookup_intent *intent;
-+	void *lock;
- };
- 
- /*
-@@ -1621,12 +1626,6 @@
- 	return dget(dentry->d_parent);
- }
- 
--static inline void unlock_dir(struct dentry *dir)
--{
--	up(&dir->d_inode->i_sem);
--	dput(dir);
--}
--
- /*
-  * Whee.. Deadlock country. Happily there are only two VFS
-  * operations that does this..
-Index: linux-2.4.20-rh/fs/inode.c
-===================================================================
---- linux-2.4.20-rh.orig/fs/inode.c	2003-09-04 20:58:35.000000000 +0800
-+++ linux-2.4.20-rh/fs/inode.c	2003-09-04 21:03:46.000000000 +0800
-@@ -121,6 +121,7 @@
- 	inode->i_data.host = inode;
- 	inode->i_data.gfp_mask = GFP_HIGHUSER;
- 	inode->i_mapping = &inode->i_data;
-+	dynlock_init(&inode->i_dcache_lock);
- }
- 
- /**
diff --git a/lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch b/lustre/kernel_patches/patches/vfs-pdirops-2.4.24.patch
similarity index 100%
rename from lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch
rename to lustre/kernel_patches/patches/vfs-pdirops-2.4.24.patch
diff --git a/lustre/kernel_patches/patches/vfs-pdirops-2.4.21-suse2.patch b/lustre/kernel_patches/patches/vfs-pdirops-2.6.7.patch
similarity index 64%
rename from lustre/kernel_patches/patches/vfs-pdirops-2.4.21-suse2.patch
rename to lustre/kernel_patches/patches/vfs-pdirops-2.6.7.patch
index d58472b7f1..9f95068a94 100644
--- a/lustre/kernel_patches/patches/vfs-pdirops-2.4.21-suse2.patch
+++ b/lustre/kernel_patches/patches/vfs-pdirops-2.6.7.patch
@@ -3,13 +3,13 @@
  include/linux/fs.h |   11 ++++----
  3 files changed, 54 insertions(+), 24 deletions(-)
 
-Index: linux-2.4.21-suse2/fs/namei.c
+Index: linux-2.6.7/fs/namei.c
 ===================================================================
---- linux-2.4.21-suse2.orig/fs/namei.c	2004-08-19 13:45:04.000000000 +0400
-+++ linux-2.4.21-suse2/fs/namei.c	2004-08-19 15:57:51.000000000 +0400
+--- linux-2.6.7.orig/fs/namei.c	2004-09-06 22:53:19.000000000 +0400
++++ linux-2.6.7/fs/namei.c	2004-09-07 14:39:44.000000000 +0400
 @@ -103,6 +103,38 @@
- }
- EXPORT_SYMBOL(intent_release);
+  * any extra contention...
+  */
  
 +void *lock_dir(struct inode *dir, struct qstr *name)
 +{
@@ -46,7 +46,7 @@ Index: linux-2.4.21-suse2/fs/namei.c
  /* In order to reduce some races, while at the same time doing additional
   * checking and hopefully speeding things up, we copy filenames to the
   * kernel data space before using them..
-@@ -305,10 +337,11 @@
+@@ -362,10 +394,11 @@
  	struct dentry * result;
  	struct inode *dir = parent->d_inode;
  	int counter = 0;
@@ -59,7 +59,7 @@ Index: linux-2.4.21-suse2/fs/namei.c
  	/*
  	 * First re-do the cached lookup just in case it was created
  	 * while we waited for the directory semaphore..
-@@ -332,7 +365,7 @@
+@@ -391,7 +424,7 @@
  			else
  				result = dentry;
  		}
@@ -68,23 +68,25 @@ Index: linux-2.4.21-suse2/fs/namei.c
  		return result;
  	}
  
-@@ -340,7 +373,7 @@
+@@ -399,7 +432,7 @@
  	 * Uhhuh! Nasty case: the cache was re-populated while
  	 * we waited on the semaphore. Need to revalidate.
  	 */
 -	up(&dir->i_sem);
 +	unlock_dir(dir, lock);
  	if (result->d_op && result->d_op->d_revalidate) {
- 		if (!result->d_op->d_revalidate(result, flags) && !d_invalidate(result)) {
+ 		if (!result->d_op->d_revalidate(result, nd) && !d_invalidate(result)) {
  			dput(result);
-@@ -1186,13 +1219,13 @@
- 		goto exit;
+@@ -1367,7 +1400,7 @@
  
  	dir = nd->dentry;
+ 	nd->flags &= ~LOOKUP_PARENT;
 -	down(&dir->d_inode->i_sem);
 +	nd->lock = lock_dir(dir->d_inode, &nd->last);
- 	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
+ 	nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+ 	nd->flags &= ~LOOKUP_LAST;
+@@ -1375,7 +1408,7 @@
  do_last:
  	error = PTR_ERR(dentry);
  	if (IS_ERR(dentry)) {
@@ -93,16 +95,16 @@ Index: linux-2.4.21-suse2/fs/namei.c
  		goto exit;
  	}
  
-@@ -1202,7 +1235,7 @@
+@@ -1384,7 +1417,7 @@
  		if (!IS_POSIXACL(dir->d_inode))
  			mode &= ~current->fs->umask;
- 		error = vfs_create_it(dir->d_inode, dentry, mode, it);
+ 		error = vfs_create(dir->d_inode, dentry, mode, nd);
 -		up(&dir->d_inode->i_sem);
 +		unlock_dir(dir->d_inode, nd->lock);		
- #ifndef DENTRY_WASTE_RAM
+ 		dput(nd->dentry);
+ 		nd->dentry = dentry;
  		if (error)
- 			d_drop(dentry);
-@@ -1220,7 +1253,7 @@
+@@ -1398,7 +1431,7 @@
  	/*
  	 * It already exists.
  	 */
@@ -111,16 +113,16 @@ Index: linux-2.4.21-suse2/fs/namei.c
  
  	error = -EEXIST;
  	if (flag & O_EXCL)
-@@ -1367,7 +1400,7 @@
+@@ -1474,7 +1507,7 @@
  		goto exit;
  	}
  	dir = nd->dentry;
 -	down(&dir->d_inode->i_sem);
 +	nd->lock = lock_dir(dir->d_inode, &nd->last);
- 	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
-@@ -1385,7 +1418,7 @@
+ 	nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
+ 	nd->flags &= ~LOOKUP_LAST;
+@@ -1494,7 +1527,7 @@
  {
  	struct dentry *dentry;
  
@@ -129,7 +131,7 @@ Index: linux-2.4.21-suse2/fs/namei.c
  	dentry = ERR_PTR(-EEXIST);
  	if (nd->last_type != LAST_NORM)
  		goto fail;
-@@ -1479,7 +1512,7 @@
+@@ -1589,7 +1622,7 @@
  		}
  		dput(dentry);
  	}
@@ -138,7 +140,7 @@ Index: linux-2.4.21-suse2/fs/namei.c
  out2:
  	path_release(&nd);
  out:
-@@ -1547,7 +1580,7 @@
+@@ -1652,7 +1685,7 @@
  			error = vfs_mkdir(nd.dentry->d_inode, dentry, mode);
  			dput(dentry);
  		}
@@ -147,13 +149,13 @@ Index: linux-2.4.21-suse2/fs/namei.c
  out2:
  		path_release(&nd);
  out:
-@@ -1657,14 +1690,14 @@
- 		if (error != -EOPNOTSUPP)
- 			goto exit1;
- 	}
+@@ -1765,14 +1798,14 @@
+  			goto exit1;
+  	}
+  
 -	down(&nd.dentry->d_inode->i_sem);
 +	nd.lock = lock_dir(nd.dentry->d_inode, &nd.last);
- 	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	dentry = lookup_hash(&nd.last, nd.dentry);
  	error = PTR_ERR(dentry);
  	if (!IS_ERR(dentry)) {
  		error = vfs_rmdir(nd.dentry->d_inode, dentry);
@@ -164,16 +166,16 @@ Index: linux-2.4.21-suse2/fs/namei.c
  exit1:
  	path_release(&nd);
  exit:
-@@ -1723,7 +1756,7 @@
- 		if (error != -EOPNOTSUPP)
- 			goto exit1;
- 	}
+@@ -1842,7 +1875,7 @@
+  		if (error != -EOPNOTSUPP)
+  			goto exit1;
+  	}
 -	down(&nd.dentry->d_inode->i_sem);
 +	nd.lock = lock_dir(nd.dentry->d_inode, &nd.last);
- 	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
+ 	dentry = lookup_hash(&nd.last, nd.dentry);
  	error = PTR_ERR(dentry);
  	if (!IS_ERR(dentry)) {
-@@ -1734,7 +1767,7 @@
+@@ -1856,7 +1889,7 @@
  	exit2:
  		dput(dentry);
  	}
@@ -182,90 +184,81 @@ Index: linux-2.4.21-suse2/fs/namei.c
  exit1:
  	path_release(&nd);
  exit:
-@@ -1808,7 +1841,7 @@
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
+@@ -1927,7 +1960,7 @@
+ 			error = vfs_symlink(nd.dentry->d_inode, dentry, from, S_IALLUGO);
  			dput(dentry);
  		}
 -		up(&nd.dentry->d_inode->i_sem);
 +		unlock_dir(nd.dentry->d_inode, nd.lock);
- 	out2:
+ out2:
  		path_release(&nd);
- 	out:
-@@ -1904,7 +1937,7 @@
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
- 			dput(new_dentry);
- 		}
--		up(&nd.dentry->d_inode->i_sem);
-+		unlock_dir(nd.dentry->d_inode, nd.lock);
+ out:
+@@ -2021,7 +2054,7 @@
+ 		error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
+ 		dput(new_dentry);
+ 	}
+-	up(&nd.dentry->d_inode->i_sem);
++	unlock_dir(nd.dentry->d_inode, nd.lock);
  out_release:
- 		path_release(&nd);
+ 	path_release(&nd);
  out:
-Index: linux-2.4.21-suse2/fs/inode.c
+Index: linux-2.6.7/fs/inode.c
 ===================================================================
---- linux-2.4.21-suse2.orig/fs/inode.c	2004-08-19 13:45:04.000000000 +0400
-+++ linux-2.4.21-suse2/fs/inode.c	2004-08-19 13:51:49.000000000 +0400
-@@ -121,6 +121,7 @@
- 		mapping->host = inode;
- 		mapping->gfp_mask = GFP_HIGHUSER;
+--- linux-2.6.7.orig/fs/inode.c	2004-09-06 22:53:19.000000000 +0400
++++ linux-2.6.7/fs/inode.c	2004-09-07 14:39:44.000000000 +0400
+@@ -165,6 +165,7 @@
+ 		}
+ 		memset(&inode->u, 0, sizeof(inode->u));
  		inode->i_mapping = mapping;
 +		dynlock_init(&inode->i_dcache_lock);
  	}
  	return inode;
  }
-Index: linux-2.4.21-suse2/include/linux/fs.h
+Index: linux-2.6.7/include/linux/fs.h
 ===================================================================
---- linux-2.4.21-suse2.orig/include/linux/fs.h	2004-08-19 13:45:04.000000000 +0400
-+++ linux-2.4.21-suse2/include/linux/fs.h	2004-08-19 13:51:49.000000000 +0400
-@@ -22,6 +22,7 @@
- #include <linux/stddef.h>
- #include <linux/string.h>
- #include <linux/frlock.h>
+--- linux-2.6.7.orig/include/linux/fs.h	2004-09-07 14:12:12.000000000 +0400
++++ linux-2.6.7/include/linux/fs.h	2004-09-07 14:39:44.000000000 +0400
+@@ -19,6 +19,7 @@
+ #include <linux/prio_tree.h>
+ #include <linux/kobject.h>
+ #include <asm/atomic.h>
 +#include <linux/dynlocks.h>
  
- #include <asm/atomic.h>
- #include <asm/bitops.h>
+ struct iovec;
+ struct nameidata;
 @@ -141,6 +142,7 @@
- #define S_IMMUTABLE	16	/* Immutable file */
- #define S_DEAD		32	/* removed, but still open directory */
  #define S_NOQUOTA	64	/* Inode is not counted to quota */
+ #define S_DIRSYNC	128	/* Directory modifications are synchronous */
+ #define S_NOCMTIME	256	/* Do not update file c/mtime */
 +#define S_PDIROPS	256	/* Parallel directory operations */
  
  /*
   * Note that nosuid etc flags are inode-specific: setting some file-system
-@@ -168,6 +170,7 @@
- #define IS_NOATIME(inode)	(__IS_FLG(inode, MS_NOATIME) || ((inode)->i_flags & S_NOATIME))
+@@ -172,6 +174,7 @@
  #define IS_NODIRATIME(inode)	__IS_FLG(inode, MS_NODIRATIME)
  #define IS_POSIXACL(inode)	__IS_FLG(inode, MS_POSIXACL)
+ #define IS_ONE_SECOND(inode)	__IS_FLG(inode, MS_ONE_SECOND)
 +#define IS_PDIROPS(inode)	__IS_FLG(inode, S_PDIROPS)
  
  #define IS_DEADDIR(inode)	((inode)->i_flags & S_DEAD)
- 
-@@ -525,6 +528,7 @@
+ #define IS_NOCMTIME(inode)	((inode)->i_flags & S_NOCMTIME)
+@@ -463,6 +466,7 @@
  	atomic_t		i_writecount;
- 	unsigned int		i_attr_flags;
+ 	void			*i_security;
  	__u32			i_generation;
 +	struct dynlock		i_dcache_lock;	/* for parallel directory ops */
  	union {
- 		struct minix_inode_info		minix_i;
- 		struct ext2_inode_info		ext2_i;
-@@ -806,6 +810,7 @@
- 	unsigned int flags;
- 	int last_type;
- 	struct lookup_intent *intent;
+ 		void		*generic_ip;
+ 	} u;
+Index: linux-2.6.7/include/linux/namei.h
+===================================================================
+--- linux-2.6.7.orig/include/linux/namei.h	2004-09-06 22:53:19.000000000 +0400
++++ linux-2.6.7/include/linux/namei.h	2004-09-07 14:40:06.000000000 +0400
+@@ -52,6 +52,7 @@
+ 	unsigned int	flags;
+ 	int		last_type;
+ 	struct lookup_intent intent;
 +	void *lock;
  };
  
  /*
-@@ -1793,12 +1798,6 @@
- 	return dget(dentry->d_parent);
- }
- 
--static inline void unlock_dir(struct dentry *dir)
--{
--	up(&dir->d_inode->i_sem);
--	dput(dir);
--}
--
- /*
-  * Whee.. Deadlock country. Happily there are only two VFS
-  * operations that does this..
diff --git a/lustre/kernel_patches/patches/vfs-wantedi-misc-2.6-suse.patch b/lustre/kernel_patches/patches/vfs-wantedi-misc-2.6-suse.patch
new file mode 100644
index 0000000000..0f52cf618e
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs-wantedi-misc-2.6-suse.patch
@@ -0,0 +1,16 @@
+Index: uml-2.6.3/include/linux/dcache.h
+===================================================================
+--- uml-2.6.3.orig/include/linux/dcache.h	2004-02-21 00:19:14.365988600 +0800
++++ uml-2.6.3/include/linux/dcache.h	2004-02-21 00:21:04.612228624 +0800
+@@ -25,6 +25,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/vfs_intent-2.4.19-pre1.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch
deleted file mode 100644
index d6861d82c8..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch
+++ /dev/null
@@ -1,1922 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
-Index: linux-2.4.19-pre1/fs/dcache.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/dcache.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/dcache.c	2003-11-21 02:51:38.000000000 +0300
-@@ -181,6 +181,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -831,13 +838,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux-2.4.19-pre1/fs/exec.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/exec.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/exec.c	2003-11-21 02:51:38.000000000 +0300
-@@ -107,8 +107,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -120,7 +122,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -342,9 +345,11 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
- 	if (path_init(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
--		err = path_walk(name, &nd);
-+		err = path_walk_it(name, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -356,7 +361,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -368,6 +374,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -970,7 +977,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux-2.4.19-pre1/fs/namei.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/namei.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/namei.c	2003-11-21 02:52:01.000000000 +0300
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 5)
-@@ -346,10 +379,12 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -445,7 +480,8 @@
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -455,7 +491,7 @@
- 	while (*name=='/')
- 		name++;
- 	if (!*name)
--		goto return_base;
-+		goto return_reval;
- 
- 	inode = nd->dentry->d_inode;
- 	if (current->link_count)
-@@ -518,9 +554,10 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE,
-+					     NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -538,7 +575,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -554,7 +591,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -574,16 +611,16 @@
- 				inode = nd->dentry->d_inode;
- 				/* fallthrough */
- 			case 1:
--				goto return_base;
-+				goto return_reval;
- 		}
- 		if (nd->dentry->d_op && nd->dentry->d_op->d_hash) {
- 			err = nd->dentry->d_op->d_hash(nd->dentry, &this);
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -593,7 +630,7 @@
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -607,7 +644,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -625,21 +663,68 @@
- 			nd->last_type = LAST_DOT;
- 		else if (this.len == 2 && this.name[1] == '.')
- 			nd->last_type = LAST_DOTDOT;
-+return_reval:
-+		/*
-+		 * We bypassed the ordinary revalidation routines.
-+		 * Check the cached dentry for staleness.
-+		 */
-+		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate(dentry, 0)) {
-+				d_invalidate(dentry);
-+				break;
-+			}
-+		}
- return_base:
- 		return 0;
- out_dput:
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -728,6 +811,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -742,7 +826,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -765,13 +850,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -783,6 +871,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -804,7 +898,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -836,6 +930,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -929,7 +1040,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -942,12 +1054,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -956,6 +1071,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -970,7 +1090,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -980,12 +1101,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
- 		if (path_init(pathname, lookup_flags(flag), nd))
--			error = path_walk(pathname, nd);
-+			error = path_walk_it(pathname, nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -995,6 +1118,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	if (path_init(pathname, LOOKUP_PARENT, nd))
- 		error = path_walk(pathname, nd);
- 	if (error)
-@@ -1011,7 +1138,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1020,10 +1147,11 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
--		error = vfs_create(dir->d_inode, dentry,
--				   mode & ~current->fs->umask);
-+		error = vfs_create_it(dir->d_inode, dentry,
-+				      mode & ~current->fs->umask, it);
- 		up(&dir->d_inode->i_sem);
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
-@@ -1127,7 +1255,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1139,8 +1267,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1159,7 +1289,10 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1181,13 +1314,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1195,7 +1335,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1252,7 +1392,20 @@
- 		error = path_walk(tmp, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	mode &= ~current->fs->umask;
-@@ -1273,6 +1422,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1321,7 +1471,18 @@
- 			error = path_walk(tmp, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_mkdir(nd.dentry->d_inode, dentry,
-@@ -1329,6 +1486,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1428,8 +1586,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1488,8 +1654,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1557,15 +1730,27 @@
- 			error = path_walk(to, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1648,7 +1829,18 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1694,7 +1882,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1775,7 +1963,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1866,9 +2054,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1884,16 +2081,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1944,20 +2141,26 @@
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -1979,7 +2182,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2021,7 +2230,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux-2.4.19-pre1/fs/namespace.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/namespace.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/namespace.c	2003-11-21 02:51:38.000000000 +0300
-@@ -107,6 +107,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -118,6 +119,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -500,15 +502,18 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
- 	if (path_init(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd))
--		err = path_walk(old_name, &old_nd);
--	if (err)
-+		err = path_walk_it(old_name, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down(&mount_sem);
- 	err = -EINVAL;
-@@ -531,6 +536,7 @@
- 	}
- 
- 	up(&mount_sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -706,6 +712,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -731,9 +738,11 @@
- 
- 	/* ... and get the mountpoint */
- 	if (path_init(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
--		retval = path_walk(dir_name, &nd);
--	if (retval)
-+		retval = path_walk_it(dir_name, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -745,6 +754,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -830,6 +841,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	char *name;
- 	int error;
- 
-@@ -844,7 +857,7 @@
- 		goto out0;
- 	error = 0;
- 	if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd))
--		error = path_walk(name, &new_nd);
-+		error = path_walk_it(name, &new_nd, &new_it);
- 	putname(name);
- 	if (error)
- 		goto out0;
-@@ -858,7 +871,7 @@
- 		goto out1;
- 	error = 0;
- 	if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd))
--		error = path_walk(name, &old_nd);
-+		error = path_walk_it(name, &old_nd, &old_it);
- 	putname(name);
- 	if (error)
- 		goto out1;
-@@ -914,8 +927,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up(&mount_sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux-2.4.19-pre1/fs/open.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/open.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/open.c	2003-11-21 02:51:38.000000000 +0300
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -71,9 +73,10 @@
- 	return error;
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -84,7 +87,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	return error;
- }
-@@ -94,12 +103,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -139,11 +149,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -191,7 +203,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -236,11 +248,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -255,11 +269,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -280,12 +308,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -300,7 +330,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if ((error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-@@ -322,6 +365,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -339,13 +383,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -361,6 +406,7 @@
- 	int error;
- 	struct nameidata nd;
- 	char *name;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	name = getname(filename);
- 	error = PTR_ERR(name);
-@@ -369,7 +415,7 @@
- 
- 	error = 0;
- 	if (path_init(name,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd))
--		error = path_walk(name, &nd);
-+		error = path_walk_it(name, &nd, &it);
- 	putname(name);
- 	if (error)
- 		goto out;
-@@ -381,6 +427,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -421,6 +468,7 @@
- 	int error;
- 	struct nameidata nd;
- 	char *name;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	name = getname(filename);
- 	error = PTR_ERR(name);
-@@ -429,7 +477,7 @@
- 
- 	path_init(name, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
- 		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
--	error = path_walk(name, &nd);	
-+	error = path_walk_it(name, &nd, &it);
- 	putname(name);
- 	if (error)
- 		goto out;
-@@ -446,39 +494,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -487,30 +552,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -530,6 +579,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -634,6 +697,7 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -641,14 +705,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -685,12 +750,15 @@
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
- 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -705,11 +773,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux-2.4.19-pre1/fs/stat.c
-===================================================================
---- linux-2.4.19-pre1.orig/fs/stat.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/fs/stat.c	2003-11-21 02:51:38.000000000 +0300
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -135,13 +139,15 @@
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -151,13 +157,15 @@
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -172,13 +180,15 @@
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -189,13 +199,15 @@
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -216,7 +228,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -235,7 +247,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -257,7 +269,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -333,12 +345,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -348,12 +362,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -368,7 +384,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: linux-2.4.19-pre1/include/linux/dcache.h
-===================================================================
---- linux-2.4.19-pre1.orig/include/linux/dcache.h	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/include/linux/dcache.h	2003-11-21 02:51:38.000000000 +0300
-@@ -5,6 +5,52 @@
- 
- #include <asm/atomic.h>
- #include <linux/mount.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -90,8 +135,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -123,6 +182,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux-2.4.19-pre1/include/linux/fs.h
-===================================================================
---- linux-2.4.19-pre1.orig/include/linux/fs.h	2003-11-21 02:51:37.000000000 +0300
-+++ linux-2.4.19-pre1/include/linux/fs.h	2003-11-21 02:51:38.000000000 +0300
-@@ -73,6 +73,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -332,6 +333,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -465,6 +469,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -534,6 +539,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -644,6 +650,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- #define DQUOT_USR_ENABLED	0x01		/* User diskquotas enabled */
-@@ -777,7 +784,8 @@
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -837,21 +845,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	int (*setattr) (struct dentry *, struct iattr *);
-+	int (*setattr_raw) (struct inode *, struct iattr *);
- 	int (*getattr) (struct dentry *, struct iattr *);
- };
- 
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1049,10 +1068,16 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1306,6 +1329,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(link_path_walk(const char *, struct nameidata *));
-@@ -1316,6 +1340,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void iput(struct inode *);
- extern void force_delete(struct inode *);
-@@ -1423,6 +1449,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux-2.4.19-pre1/include/linux/fs_struct.h
-===================================================================
---- linux-2.4.19-pre1.orig/include/linux/fs_struct.h	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/include/linux/fs_struct.h	2003-11-21 02:51:38.000000000 +0300
-@@ -34,10 +34,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -57,10 +59,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux-2.4.19-pre1/kernel/exit.c
-===================================================================
---- linux-2.4.19-pre1.orig/kernel/exit.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/kernel/exit.c	2003-11-21 02:51:38.000000000 +0300
-@@ -245,11 +245,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux-2.4.19-pre1/kernel/fork.c
-===================================================================
---- linux-2.4.19-pre1.orig/kernel/fork.c	2003-11-21 02:41:00.000000000 +0300
-+++ linux-2.4.19-pre1/kernel/fork.c	2003-11-21 02:51:38.000000000 +0300
-@@ -372,10 +372,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux-2.4.19-pre1/kernel/ksyms.c
-===================================================================
---- linux-2.4.19-pre1.orig/kernel/ksyms.c	2003-11-21 02:51:37.000000000 +0300
-+++ linux-2.4.19-pre1/kernel/ksyms.c	2003-11-21 02:51:38.000000000 +0300
-@@ -260,6 +260,9 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux-2.4.19-pre1.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux-2.4.19-pre1/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch
deleted file mode 100644
index 54b239ee2b..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch
+++ /dev/null
@@ -1,1902 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
-Index: linux-2.4.19.SuSE/fs/dcache.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/dcache.c	Mon Jan 27 05:08:04 2003
-+++ linux-2.4.19.SuSE/fs/dcache.c	Sat Nov 15 17:29:03 2003
-@@ -186,6 +186,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -838,13 +845,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux-2.4.19.SuSE/fs/exec.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/exec.c	Mon Jan 27 05:08:35 2003
-+++ linux-2.4.19.SuSE/fs/exec.c	Sat Nov 15 17:34:06 2003
-@@ -107,8 +107,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -120,7 +122,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -346,9 +349,11 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
- 	if (path_init(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
--		err = path_walk(name, &nd);
-+		err = path_walk_it(name, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -360,7 +365,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -372,6 +378,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -981,7 +988,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux-2.4.19.SuSE/fs/namei.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/namei.c	Mon Jan 27 05:08:07 2003
-+++ linux-2.4.19.SuSE/fs/namei.c	Sat Nov 15 17:52:03 2003
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 8)
-@@ -346,10 +379,12 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -447,7 +482,8 @@
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -524,12 +560,13 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE,
-+					     NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -547,7 +584,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -563,7 +600,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -590,12 +627,12 @@
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -605,7 +642,7 @@
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -619,7 +656,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -643,6 +681,25 @@
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, lookup_flags & LOOKUP_PARENT)) {
-@@ -656,15 +713,28 @@
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -753,6 +823,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -767,7 +838,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -790,13 +862,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -808,6 +883,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -829,7 +910,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -861,6 +942,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -958,7 +1056,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -971,12 +1070,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -985,6 +1087,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -999,7 +1106,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1009,12 +1117,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
- 		if (path_init(pathname, lookup_flags(flag), nd))
--			error = path_walk(pathname, nd);
-+			error = path_walk_it(pathname, nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1024,6 +1134,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	if (path_init(pathname, LOOKUP_PARENT, nd))
- 		error = path_walk(pathname, nd);
- 	if (error)
-@@ -1040,7 +1154,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1049,11 +1163,13 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
- 			mode &= ~current->fs->umask;
--		error = vfs_create(dir->d_inode, dentry, mode);
-+		error = vfs_create_it(dir->d_inode, dentry,
-+				      mode & ~current->fs->umask, it);
- 		up(&dir->d_inode->i_sem);
- #ifndef DENTRY_WASTE_RAM
- 		if (error)
-@@ -1161,7 +1277,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1173,8 +1289,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1193,7 +1311,10 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1215,13 +1336,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1229,7 +1357,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1286,7 +1414,20 @@
- 		error = path_walk(tmp, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1308,6 +1445,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1356,7 +1494,18 @@
- 			error = path_walk(tmp, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1365,6 +1510,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1466,8 +1612,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1526,8 +1680,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1595,15 +1756,27 @@
- 			error = path_walk(to, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1686,7 +1855,14 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1732,7 +1908,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1811,7 +1987,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1902,9 +2078,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1920,16 +2105,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1980,20 +2165,26 @@
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -2015,7 +2206,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2057,7 +2254,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux-2.4.19.SuSE/fs/namespace.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/namespace.c	Mon Jan 27 05:08:07 2003
-+++ linux-2.4.19.SuSE/fs/namespace.c	Sat Nov 15 17:56:42 2003
-@@ -97,6 +97,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -108,6 +109,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -491,15 +493,18 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
- 	if (path_init(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd))
--		err = path_walk(old_name, &old_nd);
--	if (err)
-+		err = path_walk_it(old_name, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -522,6 +527,7 @@
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -725,6 +731,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -750,9 +757,11 @@
- 
- 	/* ... and get the mountpoint */
- 	if (path_init(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
--		retval = path_walk(dir_name, &nd);
--	if (retval)
-+		retval = path_walk_it(dir_name, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -764,6 +773,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -929,6 +940,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	char *name;
- 	int error;
- 
-@@ -943,7 +956,7 @@
- 		goto out0;
- 	error = 0;
- 	if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd))
--		error = path_walk(name, &new_nd);
-+		error = path_walk_it(name, &new_nd, &new_it);
- 	putname(name);
- 	if (error)
- 		goto out0;
-@@ -957,7 +970,7 @@
- 		goto out1;
- 	error = 0;
- 	if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd))
--		error = path_walk(name, &old_nd);
-+		error = path_walk_it(name, &old_nd, &old_it);
- 	putname(name);
- 	if (error)
- 		goto out1;
-@@ -1013,8 +1026,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux-2.4.19.SuSE/fs/open.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/open.c	Mon Jan 27 05:08:00 2003
-+++ linux-2.4.19.SuSE/fs/open.c	Sat Nov 15 17:43:27 2003
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -108,7 +111,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	return error;
- }
-@@ -118,12 +127,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -163,11 +173,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -215,7 +227,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -260,11 +272,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -279,11 +293,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -304,12 +332,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -324,7 +354,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -347,6 +390,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -364,13 +408,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -386,6 +431,7 @@
- 	int error;
- 	struct nameidata nd;
- 	char *name;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	name = getname(filename);
- 	error = PTR_ERR(name);
-@@ -394,7 +440,7 @@
- 
- 	error = 0;
- 	if (path_init(name,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd))
--		error = path_walk(name, &nd);
-+		error = path_walk_it(name, &nd, &it);
- 	putname(name);
- 	if (error)
- 		goto out;
-@@ -406,6 +452,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -446,6 +493,7 @@
- 	int error;
- 	struct nameidata nd;
- 	char *name;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	name = getname(filename);
- 	error = PTR_ERR(name);
-@@ -454,7 +502,7 @@
- 
- 	path_init(name, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
- 		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
--	error = path_walk(name, &nd);	
-+	error = path_walk_it(name, &nd, &it);
- 	putname(name);
- 	if (error)
- 		goto out;
-@@ -471,39 +519,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -512,30 +577,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -555,6 +604,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -659,6 +722,7 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -666,14 +730,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -710,7 +775,9 @@
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
-@@ -722,6 +789,7 @@
- 				      !inode->i_mapping->a_ops->direct_IO))
- 		goto cleanup_all;
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -736,11 +804,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux-2.4.19.SuSE/fs/stat.c
-===================================================================
---- linux-2.4.19.SuSE.orig/fs/stat.c	Mon Jan 27 05:08:00 2003
-+++ linux-2.4.19.SuSE/fs/stat.c	Sat Nov 15 17:29:03 2003
-@@ -17,10 +17,16 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -141,13 +145,15 @@
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -157,13 +163,15 @@
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -178,13 +186,15 @@
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -195,13 +205,15 @@
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -222,7 +234,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -241,7 +253,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -263,7 +275,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -339,12 +351,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -354,12 +368,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -374,7 +390,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: linux-2.4.19.SuSE/include/linux/dcache.h
-===================================================================
---- linux-2.4.19.SuSE.orig/include/linux/dcache.h	Mon Jan 27 05:13:15 2003
-+++ linux-2.4.19.SuSE/include/linux/dcache.h	Sat Nov 15 17:35:46 2003
-@@ -5,6 +5,52 @@
- 
- #include <asm/atomic.h>
- #include <linux/mount.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -92,8 +137,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -125,6 +184,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux-2.4.19.SuSE/include/linux/fs.h
-===================================================================
---- linux-2.4.19.SuSE.orig/include/linux/fs.h	Sat Nov 15 17:25:06 2003
-+++ linux-2.4.19.SuSE/include/linux/fs.h	Sat Nov 15 17:29:03 2003
-@@ -73,6 +73,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -363,6 +364,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -507,6 +511,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -669,6 +674,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -799,6 +805,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- #define DQUOT_USR_ENABLED	0x01		/* User diskquotas enabled */
-@@ -947,7 +954,8 @@
- extern int __vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -1020,21 +1028,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1244,10 +1263,16 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1515,6 +1538,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(link_path_walk(const char *, struct nameidata *));
-@@ -1526,6 +1550,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void iput(struct inode *);
- extern void force_delete(struct inode *);
-@@ -1646,6 +1672,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux-2.4.19.SuSE/include/linux/fs_struct.h
-===================================================================
---- linux-2.4.19.SuSE.orig/include/linux/fs_struct.h	Fri Jul 13 15:10:44 2001
-+++ linux-2.4.19.SuSE/include/linux/fs_struct.h	Sat Nov 15 17:29:03 2003
-@@ -34,10 +34,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -57,10 +59,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux-2.4.19.SuSE/kernel/exit.c
-===================================================================
---- linux-2.4.19.SuSE.orig/kernel/exit.c	Mon Jan 27 05:08:16 2003
-+++ linux-2.4.19.SuSE/kernel/exit.c	Sat Nov 15 17:29:03 2003
-@@ -288,11 +288,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux-2.4.19.SuSE/kernel/fork.c
-===================================================================
---- linux-2.4.19.SuSE.orig/kernel/fork.c	Mon Jan 27 05:08:56 2003
-+++ linux-2.4.19.SuSE/kernel/fork.c	Sat Nov 15 17:29:03 2003
-@@ -454,10 +454,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux-2.4.19.SuSE/kernel/ksyms.c
-===================================================================
---- linux-2.4.19.SuSE.orig/kernel/ksyms.c	Sat Nov 15 17:24:46 2003
-+++ linux-2.4.19.SuSE/kernel/ksyms.c	Sat Nov 15 17:29:03 2003
-@@ -315,6 +315,9 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux-2.4.19.SuSE.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux-2.4.19.SuSE/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
deleted file mode 100644
index cf07450369..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch
+++ /dev/null
@@ -1,1992 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  330 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 ++-
- fs/open.c                 |  172 +++++++++++++++++------
- fs/proc/base.c            |    3 
- fs/stat.c                 |   52 ++++---
- include/linux/dcache.h    |   60 ++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 13 files changed, 591 insertions(+), 133 deletions(-)
-
-Index: linux/fs/dcache.c
-===================================================================
---- linux.orig/fs/dcache.c	Thu Nov 28 18:53:15 2002
-+++ linux/fs/dcache.c	Wed Mar 17 13:11:25 2004
-@@ -181,6 +181,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -830,13 +837,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux/fs/exec.c
-===================================================================
---- linux.orig/fs/exec.c	Wed Mar 17 13:00:38 2004
-+++ linux/fs/exec.c	Wed Mar 17 13:11:25 2004
-@@ -115,8 +115,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -128,7 +130,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -371,8 +374,10 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -384,7 +389,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -396,6 +402,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1120,7 +1127,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux/fs/namei.c
-===================================================================
---- linux.orig/fs/namei.c	Wed Mar 17 13:00:37 2004
-+++ linux/fs/namei.c	Wed Mar 17 13:12:31 2004
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 5)
-@@ -346,10 +379,18 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (!err && it != NULL && !(it->d.lustre.it_int_flags & IT_FL_FOLLOWED)) {
-+		/* vfs_follow_link was never called */
-+		intent_release(it);
-+		path_release(nd);
-+		err = -ENOLINK;
-+	}
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -379,15 +420,26 @@
- 	return __follow_up(mnt, dentry);
- }
- 
--static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
-+static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
-+				struct lookup_intent *it)
- {
- 	struct vfsmount *mounted;
- 
- 	spin_lock(&dcache_lock);
- 	mounted = lookup_mnt(*mnt, *dentry);
- 	if (mounted) {
-+		int opc = 0, mode = 0;
- 		*mnt = mntget(mounted);
- 		spin_unlock(&dcache_lock);
-+		if (it) {
-+			opc = it->it_op;
-+			mode = it->it_create_mode;
-+		}
-+		intent_release(it);
-+		if (it) {
-+			it->it_op = opc;
-+			it->it_create_mode = mode;
-+		}
- 		dput(*dentry);
- 		mntput(mounted->mnt_parent);
- 		*dentry = dget(mounted->mnt_root);
-@@ -399,7 +451,7 @@
- 
- int follow_down(struct vfsmount **mnt, struct dentry **dentry)
- {
--	return __follow_down(mnt,dentry);
-+	return __follow_down(mnt,dentry,NULL);
- }
-  
- static inline void follow_dotdot(struct nameidata *nd)
-@@ -435,7 +487,7 @@
- 		mntput(nd->mnt);
- 		nd->mnt = parent;
- 	}
--	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry))
-+	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry, NULL))
- 		;
- }
- 
-@@ -447,7 +499,8 @@
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -520,15 +573,15 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
- 		}
- 		/* Check mountpoints.. */
--		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
-+		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, NULL))
- 			;
- 
- 		err = -ENOENT;
-@@ -540,7 +593,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -556,7 +609,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -583,19 +636,19 @@
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
- 		}
--		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
-+		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, it))
- 			;
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -609,7 +662,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -633,6 +687,27 @@
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, 0)) {
-@@ -646,15 +721,28 @@
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -739,6 +827,17 @@
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -753,6 +852,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -767,7 +867,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -790,13 +891,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -808,6 +912,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -829,7 +939,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -860,6 +970,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -955,7 +1082,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -968,12 +1096,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -982,6 +1113,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -996,7 +1132,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1006,11 +1143,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1020,6 +1160,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1035,7 +1179,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1044,11 +1188,12 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
- 			mode &= ~current->fs->umask;
--		error = vfs_create(dir->d_inode, dentry, mode);
-+		error = vfs_create_it(dir->d_inode, dentry, mode, it);
- 		up(&dir->d_inode->i_sem);
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
-@@ -1073,7 +1218,7 @@
- 		error = -ELOOP;
- 		if (flag & O_NOFOLLOW)
- 			goto exit_dput;
--		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
-+		while (__follow_down(&nd->mnt,&dentry,it) && d_mountpoint(dentry));
- 	}
- 	error = -ENOENT;
- 	if (!dentry->d_inode)
-@@ -1152,7 +1297,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1164,8 +1309,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1184,7 +1331,16 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error) {
-+		intent_release(it);
-+	} else if (it != NULL && !(it->d.lustre.it_int_flags & IT_FL_FOLLOWED)) {
-+		/* vfs_follow_link was never called */
-+		intent_release(it);
-+		path_release(nd);
-+		error = -ENOLINK;
-+	}
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1206,13 +1362,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1220,7 +1383,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1276,7 +1439,20 @@
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1298,6 +1474,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1345,7 +1522,18 @@
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1354,6 +1542,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1454,8 +1643,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1513,8 +1710,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1581,15 +1785,27 @@
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1665,7 +1881,18 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1709,7 +1936,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1788,7 +2015,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1876,9 +2103,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1894,16 +2130,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1954,20 +2190,28 @@
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+	if (it != NULL)
-+		it->d.lustre.it_int_flags |= IT_FL_FOLLOWED;
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -1989,7 +2233,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2031,7 +2281,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux/fs/namespace.c
-===================================================================
---- linux.orig/fs/namespace.c	Thu Nov 28 18:53:15 2002
-+++ linux/fs/namespace.c	Wed Mar 17 13:11:25 2004
-@@ -99,6 +99,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -110,6 +111,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -485,14 +487,17 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -515,6 +520,7 @@
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -698,6 +704,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -722,10 +729,11 @@
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
--
-+	}
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
- 				    data_page);
-@@ -736,6 +744,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -901,6 +911,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -908,14 +920,14 @@
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -970,8 +982,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux/fs/open.c
-===================================================================
---- linux.orig/fs/open.c	Thu Nov 28 18:53:15 2002
-+++ linux/fs/open.c	Wed Mar 17 13:11:25 2004
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -108,7 +111,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	return error;
- }
-@@ -118,12 +127,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -163,11 +173,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -215,7 +227,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -260,11 +272,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -279,11 +293,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -304,12 +332,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -324,7 +354,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -347,6 +390,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -364,13 +408,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -385,8 +430,9 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -397,6 +443,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -436,9 +483,10 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -454,39 +502,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -495,30 +560,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -538,6 +587,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -642,6 +705,7 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -649,14 +713,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -693,12 +758,15 @@
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
- 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -713,11 +781,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux/fs/proc/base.c
-===================================================================
---- linux.orig/fs/proc/base.c	Wed Mar 17 13:00:35 2004
-+++ linux/fs/proc/base.c	Wed Mar 17 13:11:25 2004
-@@ -481,6 +481,9 @@
- 
- 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
- 	nd->last_type = LAST_BIND;
-+
-+	if (nd->intent != NULL)
-+		nd->intent->d.lustre.it_int_flags |= IT_FL_FOLLOWED;
- out:
- 	return error;
- }
-Index: linux/fs/stat.c
-===================================================================
---- linux.orig/fs/stat.c	Thu Sep 13 19:04:43 2001
-+++ linux/fs/stat.c	Wed Mar 17 13:12:31 2004
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -135,13 +137,15 @@
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -151,13 +155,15 @@
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -172,13 +178,15 @@
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -189,13 +197,15 @@
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -216,7 +226,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -235,7 +245,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -257,7 +267,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -333,12 +343,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -348,12 +360,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -368,7 +382,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: linux/include/linux/dcache.h
-===================================================================
---- linux.orig/include/linux/dcache.h	Thu Nov 28 18:53:15 2002
-+++ linux/include/linux/dcache.h	Wed Mar 17 13:11:25 2004
-@@ -6,6 +6,52 @@
- #include <asm/atomic.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -91,8 +136,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -124,6 +183,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux/include/linux/fs.h
-===================================================================
---- linux.orig/include/linux/fs.h	Wed Mar 17 13:11:23 2004
-+++ linux/include/linux/fs.h	Wed Mar 17 13:11:31 2004
-@@ -73,6 +73,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -340,6 +341,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -474,6 +478,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -576,6 +581,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -697,6 +703,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -817,7 +824,8 @@
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -877,21 +885,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
- 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1088,10 +1107,16 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1354,6 +1377,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1365,6 +1389,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void _inode_init_once(struct inode *);
-@@ -1503,6 +1529,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux/include/linux/fs_struct.h
-===================================================================
---- linux.orig/include/linux/fs_struct.h	Fri Jul 13 18:10:44 2001
-+++ linux/include/linux/fs_struct.h	Wed Mar 17 13:11:25 2004
-@@ -34,10 +34,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -57,10 +59,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux/kernel/exit.c
-===================================================================
---- linux.orig/kernel/exit.c	Wed Mar 17 13:00:38 2004
-+++ linux/kernel/exit.c	Wed Mar 17 13:11:25 2004
-@@ -239,11 +239,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux/kernel/fork.c
-===================================================================
---- linux.orig/kernel/fork.c	Wed Mar 17 13:00:38 2004
-+++ linux/kernel/fork.c	Wed Mar 17 13:11:25 2004
-@@ -387,10 +387,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux/kernel/ksyms.c
-===================================================================
---- linux.orig/kernel/ksyms.c	Wed Mar 17 13:11:23 2004
-+++ linux/kernel/ksyms.c	Wed Mar 17 13:11:25 2004
-@@ -315,6 +315,9 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch
deleted file mode 100644
index 05c60341a0..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch
+++ /dev/null
@@ -1,1923 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  333 ++++++++++++++++++++++++++++++++++++++--------
- fs/namespace.c            |   28 ++-
- fs/open.c                 |  176 +++++++++++++++++-------
- fs/proc/base.c            |    3 
- fs/stat.c                 |   28 ++-
- include/linux/dcache.h    |   60 ++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 13 files changed, 578 insertions(+), 129 deletions(-)
-
-Index: linux-2.4.20/fs/dcache.c
-===================================================================
---- linux-2.4.20.orig/fs/dcache.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/fs/dcache.c	Wed Mar 17 13:57:11 2004
-@@ -186,6 +186,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -841,13 +848,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux-2.4.20/fs/exec.c
-===================================================================
---- linux-2.4.20.orig/fs/exec.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/fs/exec.c	Wed Mar 17 13:57:11 2004
-@@ -114,8 +114,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -127,7 +129,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -382,8 +385,10 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -395,7 +400,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -407,6 +413,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1296,7 +1303,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux-2.4.20/fs/namei.c
-===================================================================
---- linux-2.4.20.orig/fs/namei.c	Wed Mar 17 13:57:03 2004
-+++ linux-2.4.20/fs/namei.c	Wed Mar 17 13:58:01 2004
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -334,7 +366,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= max_recursive_link)
-@@ -348,10 +381,18 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (!err && it != NULL && !(it->d.lustre.it_int_flags & IT_FL_FOLLOWED)) {
-+		/* vfs_follow_link was never called */
-+		intent_release(it);
-+		path_release(nd);
-+		err = -ENOLINK;
-+	}
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -381,15 +422,26 @@
- 	return __follow_up(mnt, dentry);
- }
- 
--static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry)
-+static inline int __follow_down(struct vfsmount **mnt, struct dentry **dentry,
-+				struct lookup_intent *it)
- {
- 	struct vfsmount *mounted;
- 
- 	spin_lock(&dcache_lock);
- 	mounted = lookup_mnt(*mnt, *dentry);
- 	if (mounted) {
-+		int opc = 0, mode = 0;
- 		*mnt = mntget(mounted);
- 		spin_unlock(&dcache_lock);
-+		if (it) {
-+			opc = it->it_op;
-+			mode = it->it_create_mode;
-+		}
-+		intent_release(it);
-+		if (it) {
-+			it->it_op = opc;
-+			it->it_create_mode = mode;
-+		}
- 		dput(*dentry);
- 		mntput(mounted->mnt_parent);
- 		*dentry = dget(mounted->mnt_root);
-@@ -401,7 +453,7 @@
- 
- int follow_down(struct vfsmount **mnt, struct dentry **dentry)
- {
--	return __follow_down(mnt,dentry);
-+	return __follow_down(mnt,dentry,NULL);
- }
-  
- static inline void follow_dotdot(struct nameidata *nd)
-@@ -437,7 +489,7 @@
- 		mntput(nd->mnt);
- 		nd->mnt = parent;
- 	}
--	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry))
-+	while (d_mountpoint(nd->dentry) && __follow_down(&nd->mnt, &nd->dentry, NULL))
- 		;
- }
- 
-@@ -449,7 +501,8 @@
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -526,18 +579,18 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
- 		}
- 		/* Check mountpoints.. */
--		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
-+		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, NULL))
- 			;
- 
- 		err = -ENOENT;
-@@ -549,7 +601,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -565,7 +617,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -592,22 +644,22 @@
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
- 		}
--		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry))
-+		while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry, it))
- 			;
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -621,7 +673,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -645,6 +698,27 @@
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, 0)) {
-@@ -658,15 +732,28 @@
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -751,6 +838,17 @@
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -765,6 +863,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -779,7 +878,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -802,13 +902,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -820,6 +923,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -841,7 +950,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -872,6 +981,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -969,7 +1095,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -982,12 +1109,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -996,6 +1126,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -1010,7 +1145,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1020,11 +1156,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1034,6 +1173,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1049,7 +1192,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1058,10 +1201,11 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
--		error = vfs_create(dir->d_inode, dentry,
--				   mode & ~current->fs->umask);
-+		error = vfs_create_it(dir->d_inode, dentry,
-+				   mode & ~current->fs->umask, it);
- 		up(&dir->d_inode->i_sem);
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
-@@ -1086,7 +1230,7 @@
- 		error = -ELOOP;
- 		if (flag & O_NOFOLLOW)
- 			goto exit_dput;
--		while (__follow_down(&nd->mnt,&dentry) && d_mountpoint(dentry));
-+		while (__follow_down(&nd->mnt,&dentry,it) && d_mountpoint(dentry));
- 	}
- 	error = -ENOENT;
- 	if (!dentry->d_inode)
-@@ -1165,7 +1309,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1177,8 +1321,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1197,7 +1343,16 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error) {
-+		intent_release(it);
-+	} else if (it != NULL && !(it->d.lustre.it_int_flags & IT_FL_FOLLOWED)) {
-+		/* vfs_follow_link was never called */
-+		intent_release(it);
-+		path_release(nd);
-+		error = -ENOLINK;
-+	}
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1219,13 +1374,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1233,7 +1395,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1289,7 +1451,20 @@
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	mode &= ~current->fs->umask;
-@@ -1310,6 +1485,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1357,7 +1533,18 @@
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_mkdir(nd.dentry->d_inode, dentry,
-@@ -1365,6 +1552,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1465,8 +1653,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1524,8 +1720,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1592,15 +1795,27 @@
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1676,7 +1891,18 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1720,7 +1946,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1799,7 +2025,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1887,9 +2113,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1905,16 +2140,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1965,20 +2200,28 @@
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+	if (it != NULL)
-+		it->d.lustre.it_int_flags |= IT_FL_FOLLOWED;
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -2002,7 +2245,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2044,7 +2293,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux-2.4.20/fs/namespace.c
-===================================================================
---- linux-2.4.20.orig/fs/namespace.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/fs/namespace.c	Wed Mar 17 13:57:11 2004
-@@ -99,6 +99,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -110,6 +111,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -485,14 +487,17 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -515,6 +520,7 @@
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -698,6 +704,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -722,9 +729,11 @@
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -736,6 +744,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -901,6 +911,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -908,14 +920,14 @@
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -970,8 +982,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux-2.4.20/fs/open.c
-===================================================================
---- linux-2.4.20.orig/fs/open.c	Wed Mar 17 13:57:03 2004
-+++ linux-2.4.20/fs/open.c	Wed Mar 17 13:57:11 2004
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -108,7 +111,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	return error;
- }
-@@ -118,12 +127,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -163,11 +173,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -215,7 +227,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -260,11 +272,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -279,11 +293,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -304,12 +332,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -324,7 +354,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -347,6 +390,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -364,13 +408,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -385,8 +430,9 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -397,6 +443,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -436,9 +483,10 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+			       LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -454,39 +502,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -495,30 +560,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
--
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
-+	error = chmod_common(nd.dentry, mode);
- 
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -538,6 +587,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -642,8 +705,9 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
--	
--	flags &= ~O_DIRECT;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
-+
-+	//flags &= ~O_DIRECT;
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -651,14 +715,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -695,12 +760,15 @@
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
- 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -715,11 +783,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux-2.4.20/fs/proc/base.c
-===================================================================
---- linux-2.4.20.orig/fs/proc/base.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/fs/proc/base.c	Wed Mar 17 13:57:11 2004
-@@ -494,6 +494,9 @@
- 
- 	error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
- 	nd->last_type = LAST_BIND;
-+
-+	if (nd->intent != NULL)
-+		nd->intent->d.lustre.it_int_flags |= IT_FL_FOLLOWED;
- out:
- 	return error;
- }
-Index: linux-2.4.20/fs/stat.c
-===================================================================
---- linux-2.4.20.orig/fs/stat.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/fs/stat.c	Wed Mar 17 13:58:01 2004
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -32,13 +34,13 @@
- 	return inode->i_nlink;
- }
- 
--static int do_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
-+static int do_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat, struct lookup_intent *it)
- {
- 	int res = 0;
- 	unsigned int blocks, indirect;
- 	struct inode *inode = dentry->d_inode;
- 
--	res = do_revalidate(dentry);
-+	res = do_revalidate(dentry, it);
- 	if (res)
- 		return res;
- 
-@@ -111,10 +113,12 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(name, &nd);
-+	error = user_path_walk_it(name, &nd, &it);
- 	if (!error) {
--		error = do_getattr(nd.mnt, nd.dentry, stat);
-+		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -124,10 +128,12 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(name, &nd);
-+	error = user_path_walk_link_it(name, &nd, &it);
- 	if (!error) {
--		error = do_getattr(nd.mnt, nd.dentry, stat);
-+		error = do_getattr(nd.mnt, nd.dentry, stat, &it);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -139,7 +145,7 @@
- 	int error = -EBADF;
- 
- 	if (f) {
--		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat);
-+		error = do_getattr(f->f_vfsmnt, f->f_dentry, stat, NULL);
- 		fput(f);
- 	}
- 	return error;
-@@ -286,7 +292,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-Index: linux-2.4.20/include/linux/dcache.h
-===================================================================
---- linux-2.4.20.orig/include/linux/dcache.h	Wed Mar 17 13:57:04 2004
-+++ linux-2.4.20/include/linux/dcache.h	Wed Mar 17 13:57:11 2004
-@@ -6,6 +6,52 @@
- #include <asm/atomic.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -96,8 +141,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -129,6 +188,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux-2.4.20/include/linux/fs.h
-===================================================================
---- linux-2.4.20.orig/include/linux/fs.h	Wed Mar 17 13:57:11 2004
-+++ linux-2.4.20/include/linux/fs.h	Wed Mar 17 13:57:11 2004
-@@ -73,6 +73,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -338,6 +339,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -473,6 +477,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -575,6 +580,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -702,6 +708,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -822,7 +829,8 @@
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -882,21 +890,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
- 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1092,10 +1111,16 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1386,6 +1409,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1397,6 +1421,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void iput(struct inode *);
-@@ -1504,6 +1530,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux-2.4.20/include/linux/fs_struct.h
-===================================================================
---- linux-2.4.20.orig/include/linux/fs_struct.h	Wed Mar 17 13:57:02 2004
-+++ linux-2.4.20/include/linux/fs_struct.h	Wed Mar 17 13:57:11 2004
-@@ -37,10 +37,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -60,10 +62,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux-2.4.20/kernel/exit.c
-===================================================================
---- linux-2.4.20.orig/kernel/exit.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/kernel/exit.c	Wed Mar 17 13:57:11 2004
-@@ -345,11 +345,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux-2.4.20/kernel/fork.c
-===================================================================
---- linux-2.4.20.orig/kernel/fork.c	Wed Mar 17 13:57:05 2004
-+++ linux-2.4.20/kernel/fork.c	Wed Mar 17 13:57:11 2004
-@@ -440,10 +440,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux-2.4.20/kernel/ksyms.c
-===================================================================
---- linux-2.4.20.orig/kernel/ksyms.c	Wed Mar 17 13:57:11 2004
-+++ linux-2.4.20/kernel/ksyms.c	Wed Mar 17 13:57:11 2004
-@@ -297,6 +297,9 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux-2.4.20.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux-2.4.20/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch
deleted file mode 100644
index be9054e473..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch
+++ /dev/null
@@ -1,1905 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
-Index: linux-ia64/fs/dcache.c
-===================================================================
---- linux-ia64.orig/fs/dcache.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/dcache.c	2004-03-17 16:05:28.000000000 -0800
-@@ -186,6 +186,13 @@ int d_invalidate(struct dentry * dentry)
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -850,13 +857,19 @@ void d_delete(struct dentry * dentry)
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux-ia64/fs/exec.c
-===================================================================
---- linux-ia64.orig/fs/exec.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/exec.c	2004-03-17 16:05:28.000000000 -0800
-@@ -119,8 +119,10 @@ asmlinkage long sys_uselib(const char * 
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -132,7 +134,8 @@ asmlinkage long sys_uselib(const char * 
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -400,8 +403,10 @@ struct file *open_exec(const char *name)
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -413,7 +418,8 @@ struct file *open_exec(const char *name)
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -425,6 +431,7 @@ out:
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1348,7 +1355,7 @@ int do_coredump(long signr, int exit_cod
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux-ia64/fs/namei.c
-===================================================================
---- linux-ia64.orig/fs/namei.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/namei.c	2004-03-17 16:06:13.000000000 -0800
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd)
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@ static struct dentry * cached_lookup(str
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@ static struct dentry * real_lookup(struc
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@ static struct dentry * real_lookup(struc
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@ static struct dentry * real_lookup(struc
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 8)
-@@ -346,10 +379,12 @@ static inline int do_follow_link(struct 
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -447,7 +482,8 @@ static inline void follow_dotdot(struct 
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -524,12 +560,12 @@ int link_path_walk(const char * name, st
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -547,7 +583,7 @@ int link_path_walk(const char * name, st
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -563,7 +599,7 @@ int link_path_walk(const char * name, st
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -590,12 +626,12 @@ last_component:
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -605,7 +641,7 @@ last_component:
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -619,7 +655,8 @@ last_component:
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -643,6 +680,27 @@ return_reval:
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, 0)) {
-@@ -656,15 +714,28 @@ out_dput:
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -749,6 +820,17 @@ walk_init_root(const char *name, struct 
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -763,6 +845,7 @@ int path_init(const char *name, unsigned
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -777,7 +860,8 @@ int path_init(const char *name, unsigned
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -800,13 +884,16 @@ struct dentry * lookup_hash(struct qstr 
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -818,6 +905,12 @@ out:
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -839,7 +932,7 @@ struct dentry * lookup_one_len(const cha
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -870,6 +963,23 @@ int __user_walk(const char *name, unsign
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -967,7 +1077,8 @@ static inline int lookup_flags(unsigned 
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -980,12 +1091,15 @@ int vfs_create(struct inode *dir, struct
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -994,6 +1108,11 @@ exit_lock:
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -1008,7 +1127,8 @@ exit_lock:
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1018,11 +1138,14 @@ int open_namei(const char * pathname, in
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1032,6 +1155,10 @@ int open_namei(const char * pathname, in
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1047,7 +1174,7 @@ int open_namei(const char * pathname, in
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1056,11 +1183,12 @@ do_last:
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
- 			mode &= ~current->fs->umask;
--		error = vfs_create(dir->d_inode, dentry, mode);
-+		error = vfs_create_it(dir->d_inode, dentry, mode, it);
- 		up(&dir->d_inode->i_sem);
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
-@@ -1164,7 +1292,7 @@ ok:
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1176,8 +1304,10 @@ ok:
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1196,7 +1326,10 @@ do_link:
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1218,13 +1351,20 @@ do_link:
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1232,7 +1372,7 @@ static struct dentry *lookup_create(stru
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1288,7 +1428,20 @@ asmlinkage long sys_mknod(const char * f
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1310,6 +1463,7 @@ asmlinkage long sys_mknod(const char * f
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1357,7 +1511,18 @@ asmlinkage long sys_mkdir(const char * p
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1366,6 +1531,7 @@ asmlinkage long sys_mkdir(const char * p
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1466,8 +1632,16 @@ asmlinkage long sys_rmdir(const char * p
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1525,8 +1699,15 @@ asmlinkage long sys_unlink(const char * 
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1593,15 +1774,27 @@ asmlinkage long sys_symlink(const char *
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1677,7 +1870,18 @@ asmlinkage long sys_link(const char * ol
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1721,7 +1925,7 @@ exit:
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1800,7 +2004,7 @@ out_unlock:
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1888,9 +2092,18 @@ static inline int do_rename(const char *
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1906,16 +2119,16 @@ static inline int do_rename(const char *
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1966,20 +2179,26 @@ out:
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -2003,7 +2222,13 @@ fail:
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2045,7 +2270,7 @@ int page_follow_link(struct dentry *dent
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux-ia64/fs/namespace.c
-===================================================================
---- linux-ia64.orig/fs/namespace.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/namespace.c	2004-03-17 16:05:28.000000000 -0800
-@@ -98,6 +98,7 @@ static void detach_mnt(struct vfsmount *
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -109,6 +110,7 @@ static void attach_mnt(struct vfsmount *
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -488,14 +490,17 @@ static int do_loopback(struct nameidata 
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -518,6 +523,7 @@ static int do_loopback(struct nameidata 
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -701,6 +707,7 @@ long do_mount(char * dev_name, char * di
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -725,9 +732,11 @@ long do_mount(char * dev_name, char * di
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -739,6 +747,8 @@ long do_mount(char * dev_name, char * di
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -904,6 +914,8 @@ asmlinkage long sys_pivot_root(const cha
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -911,14 +923,14 @@ asmlinkage long sys_pivot_root(const cha
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -973,8 +985,10 @@ out2:
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux-ia64/fs/open.c
-===================================================================
---- linux-ia64.orig/fs/open.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/open.c	2004-03-17 16:05:28.000000000 -0800
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct 
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -109,7 +112,13 @@ int do_truncate(struct dentry *dentry, l
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	up_write(&inode->i_alloc_sem);
- 	return error;
-@@ -120,12 +129,13 @@ static inline long do_sys_truncate(const
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -165,11 +175,13 @@ static inline long do_sys_truncate(const
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -217,7 +229,7 @@ static inline long do_sys_ftruncate(unsi
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -262,11 +274,13 @@ asmlinkage long sys_utime(char * filenam
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -281,11 +295,25 @@ asmlinkage long sys_utime(char * filenam
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -306,12 +334,14 @@ asmlinkage long sys_utimes(char * filena
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -326,7 +356,20 @@ asmlinkage long sys_utimes(char * filena
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -349,6 +392,7 @@ asmlinkage long sys_access(const char * 
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -366,13 +410,14 @@ asmlinkage long sys_access(const char * 
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -387,8 +432,9 @@ asmlinkage long sys_chdir(const char * f
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -399,6 +445,7 @@ asmlinkage long sys_chdir(const char * f
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -438,9 +485,10 @@ asmlinkage long sys_chroot(const char * 
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+			       LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -456,39 +504,56 @@ asmlinkage long sys_chroot(const char * 
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -497,30 +562,14 @@ out:
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -540,6 +589,20 @@ static int chown_common(struct dentry * 
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -644,6 +707,7 @@ struct file *filp_open(const char * file
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -651,14 +715,15 @@ struct file *filp_open(const char * file
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -695,7 +760,9 @@ struct file *dentry_open(struct dentry *
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
-@@ -708,6 +775,7 @@ struct file *dentry_open(struct dentry *
- 					inode->i_mapping->a_ops->direct_sector_IO)))
- 		goto cleanup_all;
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -722,11 +790,17 @@ cleanup_all:
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux-ia64/fs/stat.c
-===================================================================
---- linux-ia64.orig/fs/stat.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/fs/stat.c	2004-03-17 16:06:13.000000000 -0800
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -143,13 +145,15 @@ static int cp_new_stat(struct inode * in
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -159,13 +163,15 @@ asmlinkage long sys_stat(char * filename
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -180,13 +186,15 @@ asmlinkage long sys_newstat(char * filen
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -197,13 +205,15 @@ asmlinkage long sys_lstat(char * filenam
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -224,7 +234,7 @@ asmlinkage long sys_fstat(unsigned int f
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -243,7 +253,7 @@ asmlinkage long sys_newfstat(unsigned in
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -265,7 +275,7 @@ asmlinkage long sys_readlink(const char 
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -341,12 +351,14 @@ asmlinkage long sys_stat64(char * filena
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -356,12 +368,14 @@ asmlinkage long sys_lstat64(char * filen
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -376,7 +390,7 @@ asmlinkage long sys_fstat64(unsigned lon
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: linux-ia64/include/linux/dcache.h
-===================================================================
---- linux-ia64.orig/include/linux/dcache.h	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/include/linux/dcache.h	2004-03-17 16:05:28.000000000 -0800
-@@ -6,6 +6,52 @@
- #include <asm/atomic.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -96,8 +141,22 @@ struct dentry_operations {
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -129,6 +188,7 @@ d_iput:		no		no		yes
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux-ia64/include/linux/fs.h
-===================================================================
---- linux-ia64.orig/include/linux/fs.h	2004-03-17 16:05:28.000000000 -0800
-+++ linux-ia64/include/linux/fs.h	2004-03-17 16:05:52.000000000 -0800
-@@ -73,6 +73,7 @@ extern int leases_enable, dir_notify_ena
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -359,6 +360,9 @@ extern void set_bh_page(struct buffer_he
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -496,6 +500,7 @@ struct inode {
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -598,6 +603,7 @@ struct file {
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -726,6 +732,7 @@ struct nameidata {
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -846,7 +853,8 @@ extern int vfs_symlink(struct inode *, s
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -920,21 +928,32 @@ struct file_operations {
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1131,10 +1150,16 @@ static inline int get_lease(struct inode
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1425,6 +1448,7 @@ typedef int (*read_actor_t)(read_descrip
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1436,6 +1460,8 @@ extern struct dentry * lookup_one_len(co
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void iput(struct inode *);
-@@ -1599,6 +1625,8 @@ extern struct file_operations generic_ro
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux-ia64/include/linux/fs_struct.h
-===================================================================
---- linux-ia64.orig/include/linux/fs_struct.h	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/include/linux/fs_struct.h	2004-03-17 16:05:28.000000000 -0800
-@@ -37,10 +37,12 @@ static inline void set_fs_root(struct fs
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -60,10 +62,12 @@ static inline void set_fs_pwd(struct fs_
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux-ia64/kernel/exit.c
-===================================================================
---- linux-ia64.orig/kernel/exit.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/kernel/exit.c	2004-03-17 16:05:28.000000000 -0800
-@@ -347,11 +347,14 @@ static inline void __put_fs_struct(struc
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux-ia64/kernel/fork.c
-===================================================================
---- linux-ia64.orig/kernel/fork.c	2004-03-17 15:47:15.000000000 -0800
-+++ linux-ia64/kernel/fork.c	2004-03-17 16:05:28.000000000 -0800
-@@ -463,10 +463,13 @@ static inline struct fs_struct *__copy_f
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux-ia64/kernel/ksyms.c
-===================================================================
---- linux-ia64.orig/kernel/ksyms.c	2004-03-17 16:05:28.000000000 -0800
-+++ linux-ia64/kernel/ksyms.c	2004-03-17 16:05:51.000000000 -0800
-@@ -318,6 +318,9 @@ EXPORT_SYMBOL(read_cache_page);
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux-ia64.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux-ia64/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch
deleted file mode 100644
index 8e2fcd8f98..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch
+++ /dev/null
@@ -1,1901 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
-Index: linux-2.4.21/fs/dcache.c
-===================================================================
---- linux-2.4.21.orig/fs/dcache.c	2004-04-24 02:38:00.000000000 -0400
-+++ linux-2.4.21/fs/dcache.c	2004-04-26 19:06:31.000000000 -0400
-@@ -186,6 +186,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -838,13 +845,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: linux-2.4.21/fs/exec.c
-===================================================================
---- linux-2.4.21.orig/fs/exec.c	2004-04-24 02:39:01.000000000 -0400
-+++ linux-2.4.21/fs/exec.c	2004-04-26 19:06:31.000000000 -0400
-@@ -113,8 +113,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -126,7 +128,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -383,8 +386,10 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -396,7 +401,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -408,6 +414,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1147,7 +1154,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: linux-2.4.21/fs/namei.c
-===================================================================
---- linux-2.4.21.orig/fs/namei.c	2004-04-24 02:39:02.000000000 -0400
-+++ linux-2.4.21/fs/namei.c	2004-04-26 19:06:38.000000000 -0400
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -274,10 +281,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -295,11 +311,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -314,6 +334,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -335,6 +358,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -346,7 +378,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 8)
-@@ -360,10 +393,12 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -462,7 +497,8 @@
-  * We expect 'base' to be positive and a directory.
-  */
- static inline int __attribute__((always_inline))
--__link_path_walk(const char * name, struct nameidata *nd)
-+__link_path_walk_it(const char * name, struct nameidata *nd,
-+		    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -539,12 +575,12 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -562,7 +598,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -578,7 +614,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -605,12 +641,12 @@
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -620,7 +656,7 @@
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -634,7 +670,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -658,6 +695,27 @@
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, lookup_flags & LOOKUP_PARENT)) {
-@@ -671,6 +729,8 @@
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
-@@ -678,13 +738,13 @@
- 
- int link_path_walk(const char * name, struct nameidata *nd)
- {
--	return __link_path_walk(name,nd);
-+	return __link_path_walk_it(name, nd, NULL);
- }
- 
- static inline int __path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return __link_path_walk(name, nd);
-+	return __link_path_walk_it(name, nd, NULL);
- }
- 
- int path_walk(const char * name, struct nameidata *nd)
-@@ -692,6 +752,12 @@
- 	return __path_walk(name, nd);
- }
- 
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return __link_path_walk_it(name, nd, it);
-+}
-+
- /* SMP-safe */
- /* returns 1 if everything is done */
- static int __emul_lookup_dentry(const char *name, struct nameidata *nd)
-@@ -774,6 +840,17 @@
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -788,6 +865,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -802,7 +880,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -825,13 +904,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -843,6 +925,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -864,7 +952,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -895,6 +983,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -992,7 +1097,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -1005,12 +1111,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -1019,6 +1128,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -1033,7 +1147,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1043,11 +1158,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1057,6 +1175,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1072,7 +1194,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1081,11 +1203,12 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
- 			mode &= ~current->fs->umask;
--		error = vfs_create(dir->d_inode, dentry, mode);
-+		error = vfs_create_it(dir->d_inode, dentry, mode, it);
- 		up(&dir->d_inode->i_sem);
- #ifndef DENTRY_WASTE_RAM
- 		if (error)
-@@ -1193,7 +1316,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1205,8 +1328,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1225,7 +1350,10 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1247,13 +1375,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1261,7 +1396,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1317,7 +1452,20 @@
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1339,6 +1487,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1386,7 +1535,18 @@
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1395,6 +1555,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1495,8 +1656,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1554,8 +1723,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1622,15 +1798,27 @@
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1706,7 +1894,18 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1750,7 +1949,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1829,7 +2028,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1917,9 +2116,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1935,16 +2143,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1995,20 +2203,26 @@
- }
- 
- static inline int __attribute__((always_inline))
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = __link_path_walk(link, nd);
-+	res = __link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -2032,7 +2246,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2074,7 +2294,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: linux-2.4.21/fs/namespace.c
-===================================================================
---- linux-2.4.21.orig/fs/namespace.c	2004-04-24 02:38:41.000000000 -0400
-+++ linux-2.4.21/fs/namespace.c	2004-04-26 19:06:32.000000000 -0400
-@@ -98,6 +98,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -109,6 +110,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -488,14 +490,17 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -518,6 +523,7 @@
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -701,6 +707,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -725,9 +732,11 @@
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -739,6 +748,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -904,6 +915,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -911,14 +924,14 @@
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -973,8 +986,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: linux-2.4.21/fs/open.c
-===================================================================
---- linux-2.4.21.orig/fs/open.c	2004-04-24 02:39:01.000000000 -0400
-+++ linux-2.4.21/fs/open.c	2004-04-26 19:06:32.000000000 -0400
-@@ -20,6 +20,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -96,9 +98,10 @@
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -110,7 +113,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	up_write(&inode->i_alloc_sem);
- 	return error;
-@@ -121,12 +130,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -166,11 +176,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -218,7 +230,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -263,11 +275,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -282,11 +296,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -307,12 +335,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -327,7 +357,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -350,6 +393,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -367,13 +411,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -388,8 +433,9 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -400,6 +446,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -439,9 +486,10 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+			       LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -457,39 +505,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -498,30 +563,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -541,6 +590,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -645,6 +708,7 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -652,14 +716,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -687,7 +752,9 @@
- 	file_move(f, &inode->i_sb->s_files);
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
-@@ -699,6 +766,7 @@
- 				      !inode->i_mapping->a_ops->direct_IO))
- 		goto cleanup_all;
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -711,11 +779,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: linux-2.4.21/fs/stat.c
-===================================================================
---- linux-2.4.21.orig/fs/stat.c	2004-04-24 02:37:58.000000000 -0400
-+++ linux-2.4.21/fs/stat.c	2004-04-26 19:06:32.000000000 -0400
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -141,13 +143,15 @@
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -157,13 +161,15 @@
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -178,13 +184,15 @@
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -195,13 +203,15 @@
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -222,7 +232,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -241,7 +251,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -263,7 +273,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -339,12 +349,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -354,12 +366,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -374,7 +388,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: linux-2.4.21/include/linux/dcache.h
-===================================================================
---- linux-2.4.21.orig/include/linux/dcache.h	2004-04-24 02:37:59.000000000 -0400
-+++ linux-2.4.21/include/linux/dcache.h	2004-04-26 19:06:32.000000000 -0400
-@@ -7,6 +7,52 @@
- #include <linux/gdb.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -94,8 +139,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -127,6 +186,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: linux-2.4.21/include/linux/fs.h
-===================================================================
---- linux-2.4.21.orig/include/linux/fs.h	2004-04-26 18:56:44.000000000 -0400
-+++ linux-2.4.21/include/linux/fs.h	2004-04-26 19:06:32.000000000 -0400
-@@ -74,6 +74,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -360,6 +361,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -504,6 +508,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -666,6 +671,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 	struct list_head	f_ep_links;
- 	spinlock_t		f_ep_lock;
- };
-@@ -795,6 +801,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -916,7 +923,8 @@
- extern int __vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -991,21 +999,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags);
- 	int (*link) (struct dentry *,struct inode *,struct dentry *);
-+	int (*link_raw) (struct nameidata *,struct nameidata *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1204,10 +1223,14 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1503,6 +1526,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1515,6 +1539,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void _inode_init_once(struct inode *);
-@@ -1666,6 +1692,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: linux-2.4.21/include/linux/fs_struct.h
-===================================================================
---- linux-2.4.21.orig/include/linux/fs_struct.h	2001-07-13 18:10:44.000000000 -0400
-+++ linux-2.4.21/include/linux/fs_struct.h	2004-04-26 19:06:32.000000000 -0400
-@@ -34,10 +34,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -57,10 +59,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: linux-2.4.21/kernel/exit.c
-===================================================================
---- linux-2.4.21.orig/kernel/exit.c	2004-04-24 02:39:01.000000000 -0400
-+++ linux-2.4.21/kernel/exit.c	2004-04-26 19:06:32.000000000 -0400
-@@ -292,11 +292,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: linux-2.4.21/kernel/fork.c
-===================================================================
---- linux-2.4.21.orig/kernel/fork.c	2004-04-24 02:39:01.000000000 -0400
-+++ linux-2.4.21/kernel/fork.c	2004-04-26 19:06:32.000000000 -0400
-@@ -466,10 +466,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: linux-2.4.21/kernel/ksyms.c
-===================================================================
---- linux-2.4.21.orig/kernel/ksyms.c	2004-04-26 18:56:44.000000000 -0400
-+++ linux-2.4.21/kernel/ksyms.c	2004-04-26 19:06:32.000000000 -0400
-@@ -329,6 +329,8 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-===== include/linux/mount.h 1.7 vs edited =====
---- linux-2.4.21.orig/include/linux/mount.h	Tue Feb  5 09:49:35 2002
-+++ linux-2.4.21/include/linux/mount.h	Tue May  4 19:23:48 2004
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +39,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch
deleted file mode 100644
index dc34bb0278..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch
+++ /dev/null
@@ -1,1914 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
-Index: kernel-2.4.212lgns/fs/dcache.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/dcache.c	2003-10-28 10:33:59.000000000 -0800
-+++ kernel-2.4.212lgns/fs/dcache.c	2004-05-11 06:41:10.000000000 -0700
-@@ -186,6 +186,13 @@
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -838,13 +845,19 @@
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
-Index: kernel-2.4.212lgns/fs/exec.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/exec.c	2003-10-28 10:34:17.000000000 -0800
-+++ kernel-2.4.212lgns/fs/exec.c	2004-05-11 06:41:10.000000000 -0700
-@@ -112,8 +112,10 @@
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -125,7 +127,8 @@
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -382,8 +385,10 @@
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -395,7 +400,8 @@
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -407,6 +413,7 @@
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1150,7 +1157,7 @@
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
-Index: kernel-2.4.212lgns/fs/namei.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/namei.c	2003-10-28 10:34:18.000000000 -0800
-+++ kernel-2.4.212lgns/fs/namei.c	2004-05-11 06:41:10.000000000 -0700
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 8)
-@@ -346,10 +379,12 @@
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -447,7 +482,8 @@
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--static inline int __link_path_walk(const char * name, struct nameidata *nd)
-+static inline int __link_path_walk_it(const char * name, struct nameidata *nd,
-+					struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -524,12 +560,12 @@
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -547,7 +583,7 @@
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -563,7 +599,7 @@
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -590,12 +626,12 @@
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
- 			err = -EWOULDBLOCKIO;
- 			if (atomic)
- 				break;
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -605,7 +641,7 @@
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -619,7 +655,8 @@
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -643,6 +680,27 @@
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+			if (!nd->dentry->d_inode)
-+				goto no_inode;
-+		} else
- 		if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 			err = -ESTALE;
- 			if (!dentry->d_op->d_revalidate(dentry, lookup_flags & LOOKUP_PARENT)) {
-@@ -656,6 +714,8 @@
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
-@@ -663,13 +723,13 @@
- 
- int link_path_walk(const char * name, struct nameidata *nd)
- {
--	return __link_path_walk(name,nd);
-+	return __link_path_walk_it(name, nd, NULL);
- }
- 
- static inline int __path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return __link_path_walk(name, nd);
-+	return __link_path_walk_it(name, nd, NULL);
- }
- 
- int path_walk(const char * name, struct nameidata *nd)
-@@ -677,6 +737,12 @@
- 	return __path_walk(name, nd);
- }
- 
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return __link_path_walk_it(name, nd, it);
-+}
-+
- /* SMP-safe */
- /* returns 1 if everything is done */
- static int __emul_lookup_dentry(const char *name, struct nameidata *nd)
-@@ -759,6 +825,17 @@
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -773,6 +850,7 @@
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -787,7 +865,8 @@
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -810,13 +889,16 @@
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -828,6 +910,12 @@
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -849,7 +937,7 @@
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -880,6 +968,23 @@
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -977,7 +1082,8 @@
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -990,12 +1096,15 @@
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -1004,6 +1113,11 @@
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -1018,7 +1132,8 @@
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1028,11 +1143,14 @@
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1042,6 +1160,10 @@
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1057,7 +1179,7 @@
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1066,11 +1188,12 @@
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
- 		if (!IS_POSIXACL(dir->d_inode))
- 			mode &= ~current->fs->umask;
--		error = vfs_create(dir->d_inode, dentry, mode);
-+		error = vfs_create_it(dir->d_inode, dentry, mode, it);
- 		up(&dir->d_inode->i_sem);
- #ifndef DENTRY_WASTE_RAM
- 		if (error)
-@@ -1178,7 +1301,7 @@
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1190,8 +1313,10 @@
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1210,7 +1335,10 @@
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1232,13 +1360,20 @@
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1246,7 +1381,7 @@
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1302,7 +1437,20 @@
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1324,6 +1472,7 @@
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1371,7 +1520,18 @@
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			if (!IS_POSIXACL(nd.dentry->d_inode))
-@@ -1380,6 +1540,7 @@
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1480,8 +1641,16 @@
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1539,8 +1708,15 @@
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1607,15 +1783,27 @@
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1691,7 +1879,18 @@
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out_release;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1735,7 +1934,7 @@
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1814,7 +2013,7 @@
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1902,9 +2101,18 @@
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1920,16 +2128,16 @@
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1980,20 +2188,26 @@
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = __link_path_walk(link, nd);
-+	res = __link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -2017,7 +2231,13 @@
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2059,7 +2279,7 @@
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
-Index: kernel-2.4.212lgns/fs/namespace.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/namespace.c	2003-10-28 10:34:12.000000000 -0800
-+++ kernel-2.4.212lgns/fs/namespace.c	2004-05-11 06:41:10.000000000 -0700
-@@ -98,6 +98,7 @@
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -109,6 +110,7 @@
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +288,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 = 0;
-@@ -488,14 +490,17 @@
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -518,6 +523,7 @@
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -701,6 +707,7 @@
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -725,9 +732,11 @@
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
- 
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -739,6 +748,8 @@
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -904,6 +915,8 @@
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -911,14 +924,14 @@
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -973,8 +986,10 @@
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
-Index: kernel-2.4.212lgns/fs/open.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/open.c	2003-10-28 10:33:59.000000000 -0800
-+++ kernel-2.4.212lgns/fs/open.c	2004-05-11 06:41:10.000000000 -0700
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -109,7 +112,13 @@
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	up_write(&inode->i_alloc_sem);
- 	return error;
-@@ -120,12 +129,13 @@
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -165,11 +175,13 @@
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -217,7 +229,7 @@
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -262,11 +274,13 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -281,11 +295,25 @@
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -306,12 +334,14 @@
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -326,7 +356,20 @@
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -349,6 +392,7 @@
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -366,13 +410,14 @@
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -387,8 +432,9 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -399,6 +445,7 @@
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -438,9 +485,10 @@
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+			       LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -456,39 +504,56 @@
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -497,30 +562,14 @@
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -540,6 +589,20 @@
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -644,6 +707,7 @@
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -651,14 +715,15 @@
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -686,7 +751,9 @@
- 	file_move(f, &inode->i_sb->s_files);
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
-@@ -698,6 +765,7 @@
- 				      !inode->i_mapping->a_ops->direct_IO))
- 		goto cleanup_all;
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -710,11 +778,17 @@
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
-Index: kernel-2.4.212lgns/fs/stat.c
-===================================================================
---- kernel-2.4.212lgns.orig/fs/stat.c	2003-10-28 10:33:58.000000000 -0800
-+++ kernel-2.4.212lgns/fs/stat.c	2004-05-11 06:41:10.000000000 -0700
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -141,13 +143,15 @@
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -157,13 +161,15 @@
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -178,13 +184,15 @@
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -195,13 +203,15 @@
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -222,7 +232,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -241,7 +251,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -263,7 +273,7 @@
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -339,12 +349,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -354,12 +366,14 @@
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -374,7 +388,7 @@
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
-Index: kernel-2.4.212lgns/include/linux/dcache.h
-===================================================================
---- kernel-2.4.212lgns.orig/include/linux/dcache.h	2003-11-10 16:44:28.000000000 -0800
-+++ kernel-2.4.212lgns/include/linux/dcache.h	2004-05-11 06:41:10.000000000 -0700
-@@ -7,6 +7,52 @@
- #include <linux/gdb.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -87,6 +133,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -94,8 +142,22 @@
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -127,6 +189,7 @@
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
-Index: kernel-2.4.212lgns/include/linux/fs.h
-===================================================================
---- kernel-2.4.212lgns.orig/include/linux/fs.h	2004-05-11 06:37:51.000000000 -0700
-+++ kernel-2.4.212lgns/include/linux/fs.h	2004-05-11 06:48:41.000000000 -0700
-@@ -74,6 +74,7 @@
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -361,6 +362,9 @@
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -505,6 +509,7 @@
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -667,6 +672,7 @@
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 	struct list_head	f_ep_links;
- 	spinlock_t		f_ep_lock;
- };
-@@ -796,6 +802,7 @@
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -917,7 +924,8 @@
- extern int __vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -992,21 +1000,32 @@
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
-@@ -1046,6 +1065,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1205,10 +1225,16 @@
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+                                   struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1504,6 +1530,7 @@
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1516,6 +1543,8 @@
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void _inode_init_once(struct inode *);
-@@ -1667,6 +1696,8 @@
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
-Index: kernel-2.4.212lgns/include/linux/fs_struct.h
-===================================================================
---- kernel-2.4.212lgns.orig/include/linux/fs_struct.h	2001-07-13 15:10:44.000000000 -0700
-+++ kernel-2.4.212lgns/include/linux/fs_struct.h	2004-05-11 06:41:10.000000000 -0700
-@@ -34,10 +34,12 @@
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -57,10 +59,12 @@
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
-Index: kernel-2.4.212lgns/include/linux/mount.h
-===================================================================
---- kernel-2.4.212lgns.orig/include/linux/mount.h	2003-11-06 14:18:54.000000000 -0800
-+++ kernel-2.4.212lgns/include/linux/mount.h	2004-05-11 06:41:10.000000000 -0700
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +41,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
-Index: kernel-2.4.212lgns/kernel/exit.c
-===================================================================
---- kernel-2.4.212lgns.orig/kernel/exit.c	2003-10-28 10:34:13.000000000 -0800
-+++ kernel-2.4.212lgns/kernel/exit.c	2004-05-11 06:41:10.000000000 -0700
-@@ -288,11 +288,14 @@
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
-Index: kernel-2.4.212lgns/kernel/fork.c
-===================================================================
---- kernel-2.4.212lgns.orig/kernel/fork.c	2003-10-28 10:34:17.000000000 -0800
-+++ kernel-2.4.212lgns/kernel/fork.c	2004-05-11 06:41:10.000000000 -0700
-@@ -461,10 +461,13 @@
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
-Index: kernel-2.4.212lgns/kernel/ksyms.c
-===================================================================
---- kernel-2.4.212lgns.orig/kernel/ksyms.c	2004-05-11 06:37:51.000000000 -0700
-+++ kernel-2.4.212lgns/kernel/ksyms.c	2004-05-11 06:41:10.000000000 -0700
-@@ -327,6 +327,9 @@
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch
deleted file mode 100644
index 0a66e49f62..0000000000
--- a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch
+++ /dev/null
@@ -1,1873 +0,0 @@
- fs/dcache.c               |   19 ++
- fs/exec.c                 |   17 +-
- fs/namei.c                |  295 +++++++++++++++++++++++++++++++++++++++-------
- fs/namespace.c            |   28 +++-
- fs/open.c                 |  172 +++++++++++++++++++-------
- fs/stat.c                 |   52 +++++---
- include/linux/dcache.h    |   60 +++++++++
- include/linux/fs.h        |   32 ++++
- include/linux/fs_struct.h |    4 
- kernel/exit.c             |    3 
- kernel/fork.c             |    3 
- kernel/ksyms.c            |    1 
- 12 files changed, 558 insertions(+), 128 deletions(-)
-
---- linux-2.4.22-ac1/fs/dcache.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/dcache.c	2003-09-25 14:42:46.000000000 +0400
-@@ -181,6 +181,13 @@ int d_invalidate(struct dentry * dentry)
- 		spin_unlock(&dcache_lock);
- 		return 0;
- 	}
-+
-+	/* network invalidation by Lustre */
-+	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
-+		spin_unlock(&dcache_lock);
-+		return 0;
-+	}
-+
- 	/*
- 	 * Check whether to do a partial shrink_dcache
- 	 * to get rid of unused child entries.
-@@ -833,13 +840,19 @@ void d_delete(struct dentry * dentry)
-  * Adds a dentry to the hash according to its name.
-  */
-  
--void d_rehash(struct dentry * entry)
-+void __d_rehash(struct dentry * entry, int lock)
- {
- 	struct list_head *list = d_hash(entry->d_parent, entry->d_name.hash);
- 	if (!list_empty(&entry->d_hash)) BUG();
--	spin_lock(&dcache_lock);
-+	if (lock) spin_lock(&dcache_lock);
- 	list_add(&entry->d_hash, list);
--	spin_unlock(&dcache_lock);
-+	if (lock) spin_unlock(&dcache_lock);
-+}
-+EXPORT_SYMBOL(__d_rehash);
-+
-+void d_rehash(struct dentry * entry)
-+{
-+	__d_rehash(entry, 1);
- }
- 
- #define do_switch(x,y) do { \
---- linux-2.4.22-ac1/fs/exec.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/exec.c	2003-09-25 14:42:46.000000000 +0400
-@@ -115,8 +115,10 @@ asmlinkage long sys_uselib(const char * 
- 	struct file * file;
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	error = user_path_walk(library, &nd);
-+	error = user_path_walk_it(library, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -128,7 +130,8 @@ asmlinkage long sys_uselib(const char * 
- 	if (error)
- 		goto exit;
- 
--	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+	intent_release(&it);
- 	error = PTR_ERR(file);
- 	if (IS_ERR(file))
- 		goto out;
-@@ -390,8 +393,10 @@ struct file *open_exec(const char *name)
- 	struct inode *inode;
- 	struct file *file;
- 	int err = 0;
-+	struct lookup_intent it = { .it_op = IT_OPEN,
-+				    .it_flags = FMODE_READ|FMODE_EXEC };
- 
--	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-+	err = path_lookup_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
- 	file = ERR_PTR(err);
- 	if (!err) {
- 		inode = nd.dentry->d_inode;
-@@ -403,7 +408,8 @@ struct file *open_exec(const char *name)
- 				err = -EACCES;
- 			file = ERR_PTR(err);
- 			if (!err) {
--				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-+				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &it);
-+				intent_release(&it);
- 				if (!IS_ERR(file)) {
- 					err = deny_write_access(file);
- 					if (err) {
-@@ -415,6 +421,7 @@ out:
- 				return file;
- 			}
- 		}
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	goto out;
-@@ -1322,7 +1329,7 @@ int do_coredump(long signr, int exit_cod
- 		goto close_fail;
- 	if (!file->f_op->write)
- 		goto close_fail;
--	if (do_truncate(file->f_dentry, 0) != 0)
-+	if (do_truncate(file->f_dentry, 0, 0) != 0)
- 		goto close_fail;
- 
- 	retval = binfmt->core_dump(signr, regs, file);
---- linux-2.4.22-ac1/fs/namei.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:23.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/namei.c	2003-09-25 14:44:40.000000000 +0400
-@@ -94,6 +94,13 @@
-  * XEmacs seems to be relying on it...
-  */
- 
-+void intent_release(struct lookup_intent *it)
-+{
-+	if (it && it->it_op_release)
-+		it->it_op_release(it);
-+
-+}
-+
- /* In order to reduce some races, while at the same time doing additional
-  * checking and hopefully speeding things up, we copy filenames to the
-  * kernel data space before using them..
-@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd)
-  * Internal lookup() using the new generic dcache.
-  * SMP-safe
-  */
--static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name,
-+				    int flags, struct lookup_intent *it)
- {
- 	struct dentry * dentry = d_lookup(parent, name);
- 
-+	if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+		if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) &&
-+		    !d_invalidate(dentry)) {
-+			dput(dentry);
-+			dentry = NULL;
-+		}
-+		return dentry;
-+	} else
- 	if (dentry && dentry->d_op && dentry->d_op->d_revalidate) {
- 		if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) {
- 			dput(dentry);
-@@ -281,11 +297,15 @@ static struct dentry * cached_lookup(str
-  * make sure that nobody added the entry to the dcache in the meantime..
-  * SMP-safe
-  */
--static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags)
-+static struct dentry *real_lookup(struct dentry *parent, struct qstr *name,
-+				  int flags, struct lookup_intent *it)
- {
- 	struct dentry * result;
- 	struct inode *dir = parent->d_inode;
-+	int counter = 0;
- 
-+again:
-+	counter++;
- 	down(&dir->i_sem);
- 	/*
- 	 * First re-do the cached lookup just in case it was created
-@@ -300,6 +320,9 @@ static struct dentry * real_lookup(struc
- 		result = ERR_PTR(-ENOMEM);
- 		if (dentry) {
- 			lock_kernel();
-+			if (dir->i_op->lookup_it)
-+				result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags);
-+			else
- 			result = dir->i_op->lookup(dir, dentry);
- 			unlock_kernel();
- 			if (result)
-@@ -321,6 +344,15 @@ static struct dentry * real_lookup(struc
- 			dput(result);
- 			result = ERR_PTR(-ENOENT);
- 		}
-+	} else if (result->d_op && result->d_op->d_revalidate_it) {
-+		if (!result->d_op->d_revalidate_it(result, flags, NULL, it) &&
-+		    !d_invalidate(result)) {
-+			dput(result);
-+			if (counter > 10)
-+				result = ERR_PTR(-ESTALE);
-+			if (!IS_ERR(result))
-+				goto again;
-+		}
- 	}
- 	return result;
- }
-@@ -332,7 +364,8 @@ static struct dentry * real_lookup(struc
-  * Without that kind of total limit, nasty chains of consecutive
-  * symlinks can cause almost arbitrarily long lookups. 
-  */
--static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd)
-+static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd,
-+				 struct lookup_intent *it)
- {
- 	int err;
- 	if (current->link_count >= 5)
-@@ -346,10 +379,12 @@ static inline int do_follow_link(struct 
- 	current->link_count++;
- 	current->total_link_count++;
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	err = dentry->d_inode->i_op->follow_link(dentry, nd);
- 	current->link_count--;
- 	return err;
- loop:
-+	intent_release(it);
- 	path_release(nd);
- 	return -ELOOP;
- }
-@@ -447,7 +482,8 @@ static inline void follow_dotdot(struct 
-  *
-  * We expect 'base' to be positive and a directory.
-  */
--int link_path_walk(const char * name, struct nameidata *nd)
-+int link_path_walk_it(const char *name, struct nameidata *nd,
-+		      struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 	struct inode *inode;
-@@ -520,9 +556,9 @@ int link_path_walk(const char * name, st
- 				break;
- 		}
- 		/* This does the actual lookups.. */
--		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+		dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE);
-+			dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -540,7 +576,7 @@ int link_path_walk(const char * name, st
- 			goto out_dput;
- 
- 		if (inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, NULL);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -556,7 +592,7 @@ int link_path_walk(const char * name, st
- 			nd->dentry = dentry;
- 		}
- 		err = -ENOTDIR; 
--		if (!inode->i_op->lookup)
-+		if (!inode->i_op->lookup && !inode->i_op->lookup_it)
- 			break;
- 		continue;
- 		/* here ends the main loop */
-@@ -583,9 +619,9 @@ last_component:
- 			if (err < 0)
- 				break;
- 		}
--		dentry = cached_lookup(nd->dentry, &this, 0);
-+		dentry = cached_lookup(nd->dentry, &this, 0, it);
- 		if (!dentry) {
--			dentry = real_lookup(nd->dentry, &this, 0);
-+			dentry = real_lookup(nd->dentry, &this, 0, it);
- 			err = PTR_ERR(dentry);
- 			if (IS_ERR(dentry))
- 				break;
-@@ -595,7 +631,7 @@ last_component:
- 		inode = dentry->d_inode;
- 		if ((lookup_flags & LOOKUP_FOLLOW)
- 		    && inode && inode->i_op && inode->i_op->follow_link) {
--			err = do_follow_link(dentry, nd);
-+			err = do_follow_link(dentry, nd, it);
- 			dput(dentry);
- 			if (err)
- 				goto return_err;
-@@ -609,7 +645,8 @@ last_component:
- 			goto no_inode;
- 		if (lookup_flags & LOOKUP_DIRECTORY) {
- 			err = -ENOTDIR; 
--			if (!inode->i_op || !inode->i_op->lookup)
-+			if (!inode->i_op ||
-+			    (!inode->i_op->lookup && !inode->i_op->lookup_it))
- 				break;
- 		}
- 		goto return_base;
-@@ -635,6 +672,25 @@ return_reval:
- 		 * Check the cached dentry for staleness.
- 		 */
- 		dentry = nd->dentry;
-+		if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) {
-+			err = -ESTALE;
-+			if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) {
-+				struct dentry *new;
-+				err = permission(dentry->d_parent->d_inode,
-+						 MAY_EXEC);
-+				if (err)
-+					break;
-+				new = real_lookup(dentry->d_parent,
-+						  &dentry->d_name, 0, it);
-+				if (IS_ERR(new)) {
-+					err = PTR_ERR(new);
-+					break;
-+				}
-+				d_invalidate(dentry);
-+				dput(dentry);
-+				nd->dentry = new;
-+			}
-+		} else
- 		if (dentry && dentry->d_sb
- 		    && (dentry->d_sb->s_type->fs_flags & FS_ALWAYS_REVAL)) {
- 			err = -ESTALE;
-@@ -649,15 +705,28 @@ out_dput:
- 		dput(dentry);
- 		break;
- 	}
-+	if (err)
-+		intent_release(it);
- 	path_release(nd);
- return_err:
- 	return err;
- }
- 
-+int link_path_walk(const char * name, struct nameidata *nd)
-+{
-+	return link_path_walk_it(name, nd, NULL);
-+}
-+
-+int path_walk_it(const char * name, struct nameidata *nd, struct lookup_intent *it)
-+{
-+	current->total_link_count = 0;
-+	return link_path_walk_it(name, nd, it);
-+}
-+
- int path_walk(const char * name, struct nameidata *nd)
- {
- 	current->total_link_count = 0;
--	return link_path_walk(name, nd);
-+	return link_path_walk_it(name, nd, NULL);
- }
- 
- /* SMP-safe */
-@@ -742,6 +811,17 @@ walk_init_root(const char *name, struct 
- }
- 
- /* SMP-safe */
-+int path_lookup_it(const char *path, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	int error = 0;
-+	if (path_init(path, flags, nd))
-+		error = path_walk_it(path, nd, it);
-+	return error;
-+}
-+
-+
-+/* SMP-safe */
- int path_lookup(const char *path, unsigned flags, struct nameidata *nd)
- {
- 	int error = 0;
-@@ -756,6 +836,7 @@ int path_init(const char *name, unsigned
- {
- 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
- 	nd->flags = flags;
-+	nd->intent = NULL;
- 	if (*name=='/')
- 		return walk_init_root(name,nd);
- 	read_lock(&current->fs->lock);
-@@ -770,7 +851,8 @@ int path_init(const char *name, unsigned
-  * needs parent already locked. Doesn't follow mounts.
-  * SMP-safe.
-  */
--struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base,
-+			       struct lookup_intent *it)
- {
- 	struct dentry * dentry;
- 	struct inode *inode;
-@@ -793,13 +875,16 @@ struct dentry * lookup_hash(struct qstr 
- 			goto out;
- 	}
- 
--	dentry = cached_lookup(base, name, 0);
-+	dentry = cached_lookup(base, name, 0, it);
- 	if (!dentry) {
- 		struct dentry *new = d_alloc(base, name);
- 		dentry = ERR_PTR(-ENOMEM);
- 		if (!new)
- 			goto out;
- 		lock_kernel();
-+		if (inode->i_op->lookup_it)
-+			dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0);
-+		else
- 		dentry = inode->i_op->lookup(inode, new);
- 		unlock_kernel();
- 		if (!dentry)
-@@ -811,6 +896,12 @@ out:
- 	return dentry;
- }
- 
-+struct dentry * lookup_hash(struct qstr *name, struct dentry * base)
-+{
-+	return lookup_hash_it(name, base, NULL);
-+}
-+
-+
- /* SMP-safe */
- struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
- {
-@@ -832,7 +923,7 @@ struct dentry * lookup_one_len(const cha
- 	}
- 	this.hash = end_name_hash(hash);
- 
--	return lookup_hash(&this, base);
-+	return lookup_hash_it(&this, base, NULL);
- access:
- 	return ERR_PTR(-EACCES);
- }
-@@ -863,6 +954,23 @@ int __user_walk(const char *name, unsign
- 	return err;
- }
- 
-+int __user_walk_it(const char *name, unsigned flags, struct nameidata *nd,
-+		   struct lookup_intent *it)
-+{
-+	char *tmp;
-+	int err;
-+
-+	tmp = getname(name);
-+	err = PTR_ERR(tmp);
-+	if (!IS_ERR(tmp)) {
-+		err = 0;
-+		if (path_init(tmp, flags, nd))
-+			err = path_walk_it(tmp, nd, it);
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
- /*
-  * It's inline, so penalty for filesystems that don't use sticky bit is
-  * minimal.
-@@ -958,7 +1066,8 @@ static inline int lookup_flags(unsigned 
- 	return retval;
- }
- 
--int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+static int vfs_create_it(struct inode *dir, struct dentry *dentry, int mode,
-+			 struct lookup_intent *it)
- {
- 	int error;
- 
-@@ -971,12 +1080,15 @@ int vfs_create(struct inode *dir, struct
- 		goto exit_lock;
- 
- 	error = -EACCES;	/* shouldn't it be ENOSYS? */
--	if (!dir->i_op || !dir->i_op->create)
-+	if (!dir->i_op || (!dir->i_op->create && !dir->i_op->create_it))
- 		goto exit_lock;
- 
- 	DQUOT_INIT(dir);
- 	lock_kernel();
--	error = dir->i_op->create(dir, dentry, mode);
-+	if (dir->i_op->create_it)
-+		error = dir->i_op->create_it(dir, dentry, mode, it);
-+	else
-+		error = dir->i_op->create(dir, dentry, mode);
- 	unlock_kernel();
- exit_lock:
- 	up(&dir->i_zombie);
-@@ -985,6 +1097,11 @@ exit_lock:
- 	return error;
- }
- 
-+int vfs_create(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+	return vfs_create_it(dir, dentry, mode, NULL);
-+}
-+
- /*
-  *	open_namei()
-  *
-@@ -999,7 +1116,8 @@ exit_lock:
-  * for symlinks (where the permissions are checked later).
-  * SMP-safe
-  */
--int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
-+int open_namei_it(const char *pathname, int flag, int mode,
-+		  struct nameidata *nd, struct lookup_intent *it)
- {
- 	int acc_mode, error = 0;
- 	struct inode *inode;
-@@ -1009,11 +1127,14 @@ int open_namei(const char * pathname, in
- 
- 	acc_mode = ACC_MODE(flag);
- 
-+	if (it)
-+		it->it_flags = flag;
-+
- 	/*
- 	 * The simplest case - just a plain lookup.
- 	 */
- 	if (!(flag & O_CREAT)) {
--		error = path_lookup(pathname, lookup_flags(flag), nd);
-+		error = path_lookup_it(pathname, lookup_flags(flag), nd, it);
- 		if (error)
- 			return error;
- 		dentry = nd->dentry;
-@@ -1023,6 +1144,10 @@ int open_namei(const char * pathname, in
- 	/*
- 	 * Create - we need to know the parent.
- 	 */
-+	if (it) {
-+		it->it_create_mode = mode;
-+		it->it_op |= IT_CREAT;
-+	}
- 	error = path_lookup(pathname, LOOKUP_PARENT, nd);
- 	if (error)
- 		return error;
-@@ -1038,7 +1163,7 @@ int open_namei(const char * pathname, in
- 
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 
- do_last:
- 	error = PTR_ERR(dentry);
-@@ -1047,10 +1172,11 @@ do_last:
- 		goto exit;
- 	}
- 
-+	it->it_create_mode = mode;
- 	/* Negative dentry, just create the file */
- 	if (!dentry->d_inode) {
--		error = vfs_create(dir->d_inode, dentry,
--				   mode & ~current->fs->umask);
-+		error = vfs_create_it(dir->d_inode, dentry,
-+				   mode & ~current->fs->umask, it);
- 		up(&dir->d_inode->i_sem);
- 		dput(nd->dentry);
- 		nd->dentry = dentry;
-@@ -1154,7 +1280,7 @@ ok:
- 		if (!error) {
- 			DQUOT_INIT(inode);
- 			
--			error = do_truncate(dentry, 0);
-+			error = do_truncate(dentry, 0, 1);
- 		}
- 		put_write_access(inode);
- 		if (error)
-@@ -1166,8 +1292,10 @@ ok:
- 	return 0;
- 
- exit_dput:
-+	intent_release(it);
- 	dput(dentry);
- exit:
-+	intent_release(it);
- 	path_release(nd);
- 	return error;
- 
-@@ -1186,7 +1314,10 @@ do_link:
- 	 * are done. Procfs-like symlinks just set LAST_BIND.
- 	 */
- 	UPDATE_ATIME(dentry->d_inode);
-+	nd->intent = it;
- 	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-+	if (error)
-+		intent_release(it);
- 	dput(dentry);
- 	if (error)
- 		return error;
-@@ -1208,13 +1339,20 @@ do_link:
- 	}
- 	dir = nd->dentry;
- 	down(&dir->d_inode->i_sem);
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	putname(nd->last.name);
- 	goto do_last;
- }
- 
-+int open_namei(const char *pathname, int flag, int mode, struct nameidata *nd)
-+{
-+	return open_namei_it(pathname, flag, mode, nd, NULL);
-+}
-+
-+
- /* SMP-safe */
--static struct dentry *lookup_create(struct nameidata *nd, int is_dir)
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it)
- {
- 	struct dentry *dentry;
- 
-@@ -1222,7 +1360,7 @@ static struct dentry *lookup_create(stru
- 	dentry = ERR_PTR(-EEXIST);
- 	if (nd->last_type != LAST_NORM)
- 		goto fail;
--	dentry = lookup_hash(&nd->last, nd->dentry);
-+	dentry = lookup_hash_it(&nd->last, nd->dentry, it);
- 	if (IS_ERR(dentry))
- 		goto fail;
- 	if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
-@@ -1278,7 +1416,20 @@ asmlinkage long sys_mknod(const char * f
- 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 	if (error)
- 		goto out;
--	dentry = lookup_create(&nd, 0);
-+
-+	if (nd.last_type != LAST_NORM) {
-+		error = -EEXIST;
-+		goto out2;
-+	}
-+	if (nd.dentry->d_inode->i_op->mknod_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->mknod_raw(&nd, mode, dev);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto out2;
-+	}
-+
-+	dentry = lookup_create(&nd, 0, NULL);
- 	error = PTR_ERR(dentry);
- 
- 	mode &= ~current->fs->umask;
-@@ -1299,6 +1446,7 @@ asmlinkage long sys_mknod(const char * f
- 		dput(dentry);
- 	}
- 	up(&nd.dentry->d_inode->i_sem);
-+out2:
- 	path_release(&nd);
- out:
- 	putname(tmp);
-@@ -1346,7 +1494,20 @@ asmlinkage long sys_mkdir(const char * p
- 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 1);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->mkdir_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->mkdir_raw(&nd, mode);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 1, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_mkdir(nd.dentry->d_inode, dentry,
-@@ -1354,6 +1509,7 @@ asmlinkage long sys_mkdir(const char * p
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+out2:
- 		path_release(&nd);
- out:
- 		putname(tmp);
-@@ -1454,8 +1610,16 @@ asmlinkage long sys_rmdir(const char * p
- 			error = -EBUSY;
- 			goto exit1;
- 	}
-+	if (nd.dentry->d_inode->i_op->rmdir_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		error = op->rmdir_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		error = vfs_rmdir(nd.dentry->d_inode, dentry);
-@@ -1513,8 +1677,15 @@ asmlinkage long sys_unlink(const char * 
- 	error = -EISDIR;
- 	if (nd.last_type != LAST_NORM)
- 		goto exit1;
-+	if (nd.dentry->d_inode->i_op->unlink_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+		error = op->unlink_raw(&nd);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit1;
-+	}
- 	down(&nd.dentry->d_inode->i_sem);
--	dentry = lookup_hash(&nd.last, nd.dentry);
-+	dentry = lookup_hash_it(&nd.last, nd.dentry, NULL);
- 	error = PTR_ERR(dentry);
- 	if (!IS_ERR(dentry)) {
- 		/* Why not before? Because we want correct error value */
-@@ -1581,15 +1752,27 @@ asmlinkage long sys_symlink(const char *
- 		error = path_lookup(to, LOOKUP_PARENT, &nd);
- 		if (error)
- 			goto out;
--		dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->symlink_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->symlink_raw(&nd, from);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out2;
-+		}
-+		dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(dentry);
- 		if (!IS_ERR(dentry)) {
- 			error = vfs_symlink(nd.dentry->d_inode, dentry, from);
- 			dput(dentry);
- 		}
- 		up(&nd.dentry->d_inode->i_sem);
-+	out2:
- 		path_release(&nd);
--out:
-+	out:
- 		putname(to);
- 	}
- 	putname(from);
-@@ -1665,7 +1844,18 @@ asmlinkage long sys_link(const char * ol
- 		error = -EXDEV;
- 		if (old_nd.mnt != nd.mnt)
- 			goto out_release;
--		new_dentry = lookup_create(&nd, 0);
-+		if (nd.last_type != LAST_NORM) {
-+			error = -EEXIST;
-+			goto out2;
-+		}
-+		if (nd.dentry->d_inode->i_op->link_raw) {
-+			struct inode_operations *op = nd.dentry->d_inode->i_op;
-+			error = op->link_raw(&old_nd, &nd);
-+			/* the file system wants to use normal vfs path now */
-+			if (error != -EOPNOTSUPP)
-+				goto out_release;
-+		}
-+		new_dentry = lookup_create(&nd, 0, NULL);
- 		error = PTR_ERR(new_dentry);
- 		if (!IS_ERR(new_dentry)) {
- 			error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry);
-@@ -1709,7 +1895,7 @@ exit:
-  *	   locking].
-  */
- int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		   struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 	struct inode *target;
-@@ -1788,7 +1974,7 @@ out_unlock:
- }
- 
- int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--	       struct inode *new_dir, struct dentry *new_dentry)
-+		     struct inode *new_dir, struct dentry *new_dentry)
- {
- 	int error;
- 
-@@ -1876,9 +2062,18 @@ static inline int do_rename(const char *
- 	if (newnd.last_type != LAST_NORM)
- 		goto exit2;
- 
-+	if (old_dir->d_inode->i_op->rename_raw) {
-+		lock_kernel();
-+		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
-+		unlock_kernel();
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto exit2;
-+	}
-+
- 	double_lock(new_dir, old_dir);
- 
--	old_dentry = lookup_hash(&oldnd.last, old_dir);
-+	old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL);
- 	error = PTR_ERR(old_dentry);
- 	if (IS_ERR(old_dentry))
- 		goto exit3;
-@@ -1894,16 +2089,16 @@ static inline int do_rename(const char *
- 		if (newnd.last.name[newnd.last.len])
- 			goto exit4;
- 	}
--	new_dentry = lookup_hash(&newnd.last, new_dir);
-+	new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL);
- 	error = PTR_ERR(new_dentry);
- 	if (IS_ERR(new_dentry))
- 		goto exit4;
- 
-+
- 	lock_kernel();
- 	error = vfs_rename(old_dir->d_inode, old_dentry,
- 				   new_dir->d_inode, new_dentry);
- 	unlock_kernel();
--
- 	dput(new_dentry);
- exit4:
- 	dput(old_dentry);
-@@ -1954,20 +2149,26 @@ out:
- }
- 
- static inline int
--__vfs_follow_link(struct nameidata *nd, const char *link)
-+__vfs_follow_link(struct nameidata *nd, const char *link,
-+		  struct lookup_intent *it)
- {
- 	int res = 0;
- 	char *name;
- 	if (IS_ERR(link))
- 		goto fail;
- 
-+	if (it == NULL)
-+		it = nd->intent;
-+	else if (it != nd->intent)
-+		printk("it != nd->intent: tell phil@clusterfs.com\n");
-+
- 	if (*link == '/') {
- 		path_release(nd);
- 		if (!walk_init_root(link, nd))
- 			/* weird __emul_prefix() stuff did it */
- 			goto out;
- 	}
--	res = link_path_walk(link, nd);
-+	res = link_path_walk_it(link, nd, it);
- out:
- 	if (current->link_count || res || nd->last_type!=LAST_NORM)
- 		return res;
-@@ -1991,7 +2192,13 @@ fail:
- 
- int vfs_follow_link(struct nameidata *nd, const char *link)
- {
--	return __vfs_follow_link(nd, link);
-+	return __vfs_follow_link(nd, link, NULL);
-+}
-+
-+int vfs_follow_link_it(struct nameidata *nd, const char *link,
-+		       struct lookup_intent *it)
-+{
-+	return __vfs_follow_link(nd, link, it);
- }
- 
- /* get the link contents into pagecache */
-@@ -2033,7 +2240,7 @@ int page_follow_link(struct dentry *dent
- {
- 	struct page *page = NULL;
- 	char *s = page_getlink(dentry, &page);
--	int res = __vfs_follow_link(nd, s);
-+	int res = __vfs_follow_link(nd, s, NULL);
- 	if (page) {
- 		kunmap(page);
- 		page_cache_release(page);
---- linux-2.4.22-ac1/fs/namespace.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:28.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/namespace.c	2003-09-25 14:42:46.000000000 +0400
-@@ -98,6 +98,7 @@ static void detach_mnt(struct vfsmount *
- {
- 	old_nd->dentry = mnt->mnt_mountpoint;
- 	old_nd->mnt = mnt->mnt_parent;
-+	UNPIN(old_nd->dentry, old_nd->mnt, 1);
- 	mnt->mnt_parent = mnt;
- 	mnt->mnt_mountpoint = mnt->mnt_root;
- 	list_del_init(&mnt->mnt_child);
-@@ -109,6 +110,7 @@ static void attach_mnt(struct vfsmount *
- {
- 	mnt->mnt_parent = mntget(nd->mnt);
- 	mnt->mnt_mountpoint = dget(nd->dentry);
-+	PIN(nd->dentry, nd->mnt, 1);
- 	list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
- 	list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
- 	nd->dentry->d_mounted++;
-@@ -286,7 +293,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 = 0;
-@@ -488,14 +490,17 @@ static int do_loopback(struct nameidata 
- {
- 	struct nameidata old_nd;
- 	struct vfsmount *mnt = NULL;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int err = mount_is_safe(nd);
- 	if (err)
- 		return err;
- 	if (!old_name || !*old_name)
- 		return -EINVAL;
--	err = path_lookup(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd);
--	if (err)
-+	err = path_lookup_it(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd, &it);
-+	if (err) {
-+		intent_release(&it);
- 		return err;
-+	}
- 
- 	down_write(&current->namespace->sem);
- 	err = -EINVAL;
-@@ -518,6 +523,7 @@ static int do_loopback(struct nameidata 
- 	}
- 
- 	up_write(&current->namespace->sem);
-+	intent_release(&it);
- 	path_release(&old_nd);
- 	return err;
- }
-@@ -701,6 +707,7 @@ long do_mount(char * dev_name, char * di
- 		  unsigned long flags, void *data_page)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int retval = 0;
- 	int mnt_flags = 0;
- 
-@@ -725,9 +732,11 @@ long do_mount(char * dev_name, char * di
- 	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
- 
- 	/* ... and get the mountpoint */
--	retval = path_lookup(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
--	if (retval)
-+	retval = path_lookup_it(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd, &it);
-+	if (retval) {
-+		intent_release(&it);
- 		return retval;
-+	}
-
- 	if (flags & MS_REMOUNT)
- 		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
-@@ -739,6 +747,8 @@ long do_mount(char * dev_name, char * di
- 	else
- 		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
- 				      dev_name, data_page);
-+
-+	intent_release(&it);
- 	path_release(&nd);
- 	return retval;
- }
-@@ -904,6 +914,8 @@ asmlinkage long sys_pivot_root(const cha
- {
- 	struct vfsmount *tmp;
- 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
-+	struct lookup_intent new_it = { .it_op = IT_GETATTR };
-+	struct lookup_intent old_it = { .it_op = IT_GETATTR };
- 	int error;
- 
- 	if (!capable(CAP_SYS_ADMIN))
-@@ -911,14 +923,14 @@ asmlinkage long sys_pivot_root(const cha
- 
- 	lock_kernel();
- 
--	error = __user_walk(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
-+	error = __user_walk_it(new_root, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd, &new_it);
- 	if (error)
- 		goto out0;
- 	error = -EINVAL;
- 	if (!check_mnt(new_nd.mnt))
- 		goto out1;
- 
--	error = __user_walk(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd);
-+	error = __user_walk_it(put_old, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd, &old_it);
- 	if (error)
- 		goto out1;
- 
-@@ -973,8 +985,10 @@ out2:
- 	up(&old_nd.dentry->d_inode->i_zombie);
- 	up_write(&current->namespace->sem);
- 	path_release(&user_nd);
-+	intent_release(&old_it);
- 	path_release(&old_nd);
- out1:
-+	intent_release(&new_it);
- 	path_release(&new_nd);
- out0:
- 	unlock_kernel();
---- linux-2.4.22-ac1/fs/open.c~vfs_intent-2.4.22-rh	2003-08-25 15:44:43.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/open.c	2003-09-25 14:42:46.000000000 +0400
-@@ -19,6 +19,8 @@
- #include <asm/uaccess.h>
- 
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-+extern int path_walk_it(const char *name, struct nameidata *nd,
-+			struct lookup_intent *it);
- 
- int vfs_statfs(struct super_block *sb, struct statfs *buf)
- {
-@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct 
- 	write_unlock(&files->file_lock);
- }
- 
--int do_truncate(struct dentry *dentry, loff_t length)
-+int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
- {
- 	struct inode *inode = dentry->d_inode;
-+	struct inode_operations *op = dentry->d_inode->i_op;
- 	int error;
- 	struct iattr newattrs;
- 
-@@ -109,7 +112,13 @@ int do_truncate(struct dentry *dentry, l
- 	down(&inode->i_sem);
- 	newattrs.ia_size = length;
- 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--	error = notify_change(dentry, &newattrs);
-+	if (called_from_open)
-+		newattrs.ia_valid |= ATTR_FROM_OPEN;
-+	if (op->setattr_raw) {
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+	} else
-+		error = notify_change(dentry, &newattrs);
- 	up(&inode->i_sem);
- 	up_write(&inode->i_alloc_sem);
- 	return error;
-@@ -120,12 +129,13 @@ static inline long do_sys_truncate(const
- 	struct nameidata nd;
- 	struct inode * inode;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	error = -EINVAL;
- 	if (length < 0)	/* sorry, but loff_t says... */
- 		goto out;
- 
--	error = user_path_walk(path, &nd);
-+	error = user_path_walk_it(path, &nd, &it);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
-@@ -165,11 +175,13 @@ static inline long do_sys_truncate(const
- 	error = locks_verify_truncate(inode, NULL, length);
- 	if (!error) {
- 		DQUOT_INIT(inode);
--		error = do_truncate(nd.dentry, length);
-+		intent_release(&it);
-+		error = do_truncate(nd.dentry, length, 0);
- 	}
- 	put_write_access(inode);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -217,7 +229,7 @@ static inline long do_sys_ftruncate(unsi
- 
- 	error = locks_verify_truncate(inode, file, length);
- 	if (!error)
--		error = do_truncate(dentry, length);
-+		error = do_truncate(dentry, length, 0);
- out_putf:
- 	fput(file);
- out:
-@@ -262,11 +274,13 @@ asmlinkage long sys_utime(char * filenam
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -281,11 +295,25 @@ asmlinkage long sys_utime(char * filenam
- 			goto dput_and_out;
- 
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!times) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
- 	}
-+
- 	error = notify_change(nd.dentry, &newattrs);
- dput_and_out:
- 	path_release(&nd);
-@@ -306,12 +334,14 @@ asmlinkage long sys_utimes(char * filena
- 	struct inode * inode;
- 	struct iattr newattrs;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, NULL);
- 
- 	if (error)
- 		goto out;
- 	inode = nd.dentry->d_inode;
- 
-+	/* this is safe without a Lustre lock because it only depends
-+	   on the super block */
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto dput_and_out;
-@@ -326,7 +356,20 @@ asmlinkage long sys_utimes(char * filena
- 		newattrs.ia_atime = times[0].tv_sec;
- 		newattrs.ia_mtime = times[1].tv_sec;
- 		newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
--	} else {
-+	}
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = nd.dentry->d_inode->i_op;
-+
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			goto dput_and_out;
-+	}
-+
-+	error = -EPERM;
-+	if (!utimes) {
- 		if (current->fsuid != inode->i_uid &&
- 		    (error = permission(inode,MAY_WRITE)) != 0)
- 			goto dput_and_out;
-@@ -349,6 +392,7 @@ asmlinkage long sys_access(const char * 
- 	int old_fsuid, old_fsgid;
- 	kernel_cap_t old_cap;
- 	int res;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
- 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
- 		return -EINVAL;
-@@ -366,13 +410,14 @@ asmlinkage long sys_access(const char * 
- 	else
- 		current->cap_effective = current->cap_permitted;
- 
--	res = user_path_walk(filename, &nd);
-+	res = user_path_walk_it(filename, &nd, &it);
- 	if (!res) {
- 		res = permission(nd.dentry->d_inode, mode);
- 		/* SuS v2 requires we report a read only fs too */
- 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
- 		   && !special_file(nd.dentry->d_inode->i_mode))
- 			res = -EROFS;
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 
-@@ -387,8 +432,9 @@ asmlinkage long sys_chdir(const char * f
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd);
-+	error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -399,6 +445,7 @@ asmlinkage long sys_chdir(const char * f
- 	set_fs_pwd(current->fs, nd.mnt, nd.dentry);
- 
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
-@@ -438,9 +485,10 @@ asmlinkage long sys_chroot(const char * 
- {
- 	int error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = __user_walk(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
--		      LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
-+	error = __user_walk_it(filename, LOOKUP_POSITIVE | LOOKUP_FOLLOW |
-+			       LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd, &it);
- 	if (error)
- 		goto out;
- 
-@@ -456,39 +504,56 @@ asmlinkage long sys_chroot(const char * 
- 	set_fs_altroot();
- 	error = 0;
- dput_and_out:
-+	intent_release(&it);
- 	path_release(&nd);
- out:
- 	return error;
- }
- 
--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+int chmod_common(struct dentry *dentry, mode_t mode)
- {
--	struct inode * inode;
--	struct dentry * dentry;
--	struct file * file;
--	int err = -EBADF;
-+	struct inode *inode = dentry->d_inode;
- 	struct iattr newattrs;
-+	int err = -EROFS;
- 
--	file = fget(fd);
--	if (!file)
-+	if (IS_RDONLY(inode))
- 		goto out;
- 
--	dentry = file->f_dentry;
--	inode = dentry->d_inode;
-+	if (inode->i_op->setattr_raw) {
-+		newattrs.ia_mode = mode;
-+		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		err = inode->i_op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (err != -EOPNOTSUPP)
-+			goto out;
-+	}
- 
--	err = -EROFS;
--	if (IS_RDONLY(inode))
--		goto out_putf;
- 	err = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto out_putf;
-+		goto out;
-+
- 	if (mode == (mode_t) -1)
- 		mode = inode->i_mode;
- 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
- 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- 	err = notify_change(dentry, &newattrs);
- 
--out_putf:
-+out:
-+	return err;
-+}
-+
-+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
-+{
-+	struct file * file;
-+	int err = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	err = chmod_common(file->f_dentry, mode);
-+
- 	fput(file);
- out:
- 	return err;
-@@ -497,30 +562,14 @@ out:
- asmlinkage long sys_chmod(const char * filename, mode_t mode)
- {
- 	struct nameidata nd;
--	struct inode * inode;
- 	int error;
--	struct iattr newattrs;
- 
- 	error = user_path_walk(filename, &nd);
- 	if (error)
- 		goto out;
--	inode = nd.dentry->d_inode;
--
--	error = -EROFS;
--	if (IS_RDONLY(inode))
--		goto dput_and_out;
- 
--	error = -EPERM;
--	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
--		goto dput_and_out;
-+	error = chmod_common(nd.dentry, mode);
- 
--	if (mode == (mode_t) -1)
--		mode = inode->i_mode;
--	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--	error = notify_change(nd.dentry, &newattrs);
--
--dput_and_out:
- 	path_release(&nd);
- out:
- 	return error;
-@@ -540,6 +589,20 @@ static int chown_common(struct dentry * 
- 	error = -EROFS;
- 	if (IS_RDONLY(inode))
- 		goto out;
-+
-+	if (inode->i_op->setattr_raw) {
-+		struct inode_operations *op = dentry->d_inode->i_op;
-+
-+		newattrs.ia_uid = user;
-+		newattrs.ia_gid = group;
-+		newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
-+		newattrs.ia_valid |= ATTR_RAW;
-+		error = op->setattr_raw(inode, &newattrs);
-+		/* the file system wants to use normal vfs path now */
-+		if (error != -EOPNOTSUPP)
-+			return error;
-+	}
-+
- 	error = -EPERM;
- 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
- 		goto out;
-@@ -644,6 +707,7 @@ struct file *filp_open(const char * file
- {
- 	int namei_flags, error;
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_OPEN };
- 
- 	namei_flags = flags;
- 	if ((namei_flags+1) & O_ACCMODE)
-@@ -651,14 +715,15 @@ struct file *filp_open(const char * file
- 	if (namei_flags & O_TRUNC)
- 		namei_flags |= 2;
- 
--	error = open_namei(filename, namei_flags, mode, &nd);
--	if (!error)
--		return dentry_open(nd.dentry, nd.mnt, flags);
-+	error = open_namei_it(filename, namei_flags, mode, &nd, &it);
-+	if (error)
-+		return ERR_PTR(error);
- 
--	return ERR_PTR(error);
-+	return dentry_open_it(nd.dentry, nd.mnt, flags, &it);
- }
- 
--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt,
-+			    int flags, struct lookup_intent *it)
- {
- 	struct file * f;
- 	struct inode *inode;
-@@ -695,12 +760,15 @@ struct file *dentry_open(struct dentry *
- 	}
- 
- 	if (f->f_op && f->f_op->open) {
-+		f->f_it = it;
- 		error = f->f_op->open(inode,f);
-+		f->f_it = NULL;
- 		if (error)
- 			goto cleanup_all;
- 	}
- 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
- 
-+	intent_release(it);
- 	return f;
- 
- cleanup_all:
-@@ -715,11 +783,17 @@ cleanup_all:
- cleanup_file:
- 	put_filp(f);
- cleanup_dentry:
-+	intent_release(it);
- 	dput(dentry);
- 	mntput(mnt);
- 	return ERR_PTR(error);
- }
- 
-+struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
-+{
-+	return dentry_open_it(dentry, mnt, flags, NULL);
-+}
-+
- /*
-  * Find an empty file descriptor entry, and mark it busy.
-  */
---- linux-2.4.22-ac1/fs/stat.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:27.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/stat.c	2003-09-25 14:42:46.000000000 +0400
-@@ -17,10 +17,12 @@
-  * Revalidate the inode. This is required for proper NFS attribute caching.
-  */
- static __inline__ int
--do_revalidate(struct dentry *dentry)
-+do_revalidate(struct dentry *dentry, struct lookup_intent *it)
- {
- 	struct inode * inode = dentry->d_inode;
--	if (inode->i_op && inode->i_op->revalidate)
-+	if (inode->i_op && inode->i_op->revalidate_it)
-+		return inode->i_op->revalidate_it(dentry, it);
-+	else if (inode->i_op && inode->i_op->revalidate)
- 		return inode->i_op->revalidate(dentry);
- 	return 0;
- }
-@@ -143,13 +147,15 @@ static int cp_new_stat(struct inode * in
- asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -159,13 +165,15 @@ asmlinkage long sys_stat(char * filename
- asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -180,13 +188,15 @@ asmlinkage long sys_newstat(char * filen
- asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_old_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -197,13 +207,15 @@ asmlinkage long sys_lstat(char * filenam
- asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
- {
- 	struct nameidata nd;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 	int error;
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -224,7 +236,7 @@ asmlinkage long sys_fstat(unsigned int f
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_old_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -243,7 +255,7 @@ asmlinkage long sys_newfstat(unsigned in
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat(dentry->d_inode, statbuf);
- 		fput(f);
-@@ -265,7 +277,7 @@ asmlinkage long sys_readlink(const char 
- 
- 		error = -EINVAL;
- 		if (inode->i_op && inode->i_op->readlink &&
--		    !(error = do_revalidate(nd.dentry))) {
-+		    !(error = do_revalidate(nd.dentry, NULL))) {
- 			UPDATE_ATIME(inode);
- 			error = inode->i_op->readlink(nd.dentry, buf, bufsiz);
- 		}
-@@ -341,12 +353,14 @@ asmlinkage long sys_stat64(char * filena
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk(filename, &nd);
-+	error = user_path_walk_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -356,12 +370,14 @@ asmlinkage long sys_lstat64(char * filen
- {
- 	struct nameidata nd;
- 	int error;
-+	struct lookup_intent it = { .it_op = IT_GETATTR };
- 
--	error = user_path_walk_link(filename, &nd);
-+	error = user_path_walk_link_it(filename, &nd, &it);
- 	if (!error) {
--		error = do_revalidate(nd.dentry);
-+		error = do_revalidate(nd.dentry, &it);
- 		if (!error)
- 			error = cp_new_stat64(nd.dentry->d_inode, statbuf);
-+		intent_release(&it);
- 		path_release(&nd);
- 	}
- 	return error;
-@@ -376,7 +392,7 @@ asmlinkage long sys_fstat64(unsigned lon
- 	if (f) {
- 		struct dentry * dentry = f->f_dentry;
- 
--		err = do_revalidate(dentry);
-+		err = do_revalidate(dentry, NULL);
- 		if (!err)
- 			err = cp_new_stat64(dentry->d_inode, statbuf);
- 		fput(f);
---- linux-2.4.22-ac1/include/linux/dcache.h~vfs_intent-2.4.22-rh	2003-09-25 14:16:28.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/dcache.h	2003-09-25 14:42:46.000000000 +0400
-@@ -6,6 +6,52 @@
- #include <asm/atomic.h>
- #include <linux/mount.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#define IT_OPEN     0x0001
-+#define IT_CREAT    0x0002
-+#define IT_READDIR  0x0004
-+#define IT_GETATTR  0x0008
-+#define IT_LOOKUP   0x0010
-+#define IT_UNLINK   0x0020
-+#define IT_GETXATTR 0x0040
-+#define IT_EXEC     0x0080
-+#define IT_PIN      0x0100
-+#define IT_CHDIR    0x0200
-+
-+#define IT_FL_LOCKED   0x0001
-+#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */
-+
-+#define INTENT_MAGIC 0x19620323
-+
-+
-+struct lustre_intent_data {
-+	int       it_disposition;
-+	int       it_status;
-+	__u64     it_lock_handle;
-+	void     *it_data;
-+	int       it_lock_mode;
-+	int it_int_flags;
-+};
-+struct lookup_intent {
-+	int     it_magic;
-+	void    (*it_op_release)(struct lookup_intent *);
-+	int     it_op;
-+	int     it_flags;
-+	int     it_create_mode;
-+	union {
-+		struct lustre_intent_data lustre;
-+	} d;
-+};
-+
-+static inline void intent_init(struct lookup_intent *it, int op, int flags)
-+{
-+	memset(it, 0, sizeof(*it));
-+	it->it_magic = INTENT_MAGIC;
-+	it->it_op = op;
-+	it->it_flags = flags;
-+}
-+
- 
- /*
-  * linux/include/linux/dcache.h
-@@ -84,6 +130,8 @@
- 	unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */
- };
- 
-+struct nameidata;
-+
- struct dentry_operations {
- 	int (*d_revalidate)(struct dentry *, int);
- 	int (*d_hash) (struct dentry *, struct qstr *);
-@@ -95,8 +140,22 @@ struct dentry_operations {
- 	int (*d_delete)(struct dentry *);
- 	void (*d_release)(struct dentry *);
- 	void (*d_iput)(struct dentry *, struct inode *);
-+	int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *);
-+	void (*d_pin)(struct dentry *, struct vfsmount * , int);
-+	void (*d_unpin)(struct dentry *, struct vfsmount *, int);
- };
- 
-+#define PIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_pin) \
-+				de->d_op->d_pin(de, mnt, flag);
-+#define UNPIN(de,mnt,flag)  if (de && de->d_op && de->d_op->d_unpin) \
-+				de->d_op->d_unpin(de, mnt, flag);
-+
-+
-+/* defined in fs/namei.c */
-+extern void intent_release(struct lookup_intent *it);
-+/* defined in fs/dcache.c */
-+extern void __d_rehash(struct dentry * entry, int lock);
-+
- /* the dentry parameter passed to d_hash and d_compare is the parent
-  * directory of the entries to be compared. It is used in case these
-  * functions need any directory specific information for determining
-@@ -128,6 +187,7 @@ d_iput:		no		no		yes
- 					 * s_nfsd_free_path semaphore will be down
- 					 */
- #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
-+#define DCACHE_LUSTRE_INVALID	0x0010  /* Lustre invalidated */
- 
- extern spinlock_t dcache_lock;
- 
---- linux-2.4.22-ac1/include/linux/fs.h~vfs_intent-2.4.22-rh	2003-09-25 14:39:01.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/fs.h	2003-09-25 14:42:46.000000000 +0400
-@@ -73,6 +73,7 @@ extern int leases_enable, dir_notify_ena
- 
- #define FMODE_READ 1
- #define FMODE_WRITE 2
-+#define FMODE_EXEC 4
- 
- #define READ 0
- #define WRITE 1
-@@ -343,6 +344,9 @@ extern void set_bh_page(struct buffer_he
- #define ATTR_MTIME_SET	256
- #define ATTR_FORCE	512	/* Not a change, but a change it */
- #define ATTR_ATTR_FLAG	1024
-+#define ATTR_RAW	0x0800	/* file system, not vfs will massage attrs */
-+#define ATTR_FROM_OPEN	0x1000	/* called from open path, ie O_TRUNC */
-+#define ATTR_CTIME_SET	0x2000
- 
- /*
-  * This is the Inode Attributes structure, used for notify_change().  It
-@@ -481,6 +485,7 @@ struct inode {
- 	struct pipe_inode_info	*i_pipe;
- 	struct block_device	*i_bdev;
- 	struct char_device	*i_cdev;
-+	void			*i_filterdata;
- 
- 	unsigned long		i_dnotify_mask; /* Directory notify events */
- 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
-@@ -583,6 +588,7 @@ struct file {
- 
- 	/* needed for tty driver, and maybe others */
- 	void			*private_data;
-+	struct lookup_intent    *f_it;
- 
- 	/* preallocated helper kiobuf to speedup O_DIRECT */
- 	struct kiobuf		*f_iobuf;
-@@ -703,6 +709,7 @@ struct nameidata {
- 	struct qstr last;
- 	unsigned int flags;
- 	int last_type;
-+	struct lookup_intent *intent;
- };
- 
- /*
-@@ -823,7 +830,8 @@ extern int vfs_symlink(struct inode *, s
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-+	       struct inode *new_dir, struct dentry *new_dentry);
- 
- /*
-  * File types
-@@ -883,21 +891,32 @@ struct file_operations {
- 
- struct inode_operations {
- 	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 *);
-+	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 *);
- 	int (*unlink) (struct inode *,struct dentry *);
-+	int (*unlink_raw) (struct nameidata *);
- 	int (*symlink) (struct inode *,struct dentry *,const char *);
-+	int (*symlink_raw) (struct nameidata *,const char *);
- 	int (*mkdir) (struct inode *,struct dentry *,int);
-+	int (*mkdir_raw) (struct nameidata *,int);
- 	int (*rmdir) (struct inode *,struct dentry *);
-+	int (*rmdir_raw) (struct nameidata *);
- 	int (*mknod) (struct inode *,struct dentry *,int,int);
-+	int (*mknod_raw) (struct nameidata *,int,dev_t);
- 	int (*rename) (struct inode *, struct dentry *,
- 			struct inode *, struct dentry *);
-+	int (*rename_raw) (struct nameidata *, struct nameidata *);
- 	int (*readlink) (struct dentry *, char *,int);
- 	int (*follow_link) (struct dentry *, struct nameidata *);
- 	void (*truncate) (struct inode *);
- 	int (*permission) (struct inode *, int);
- 	int (*revalidate) (struct dentry *);
-+	int (*revalidate_it) (struct dentry *, struct lookup_intent *);
- 	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);
- 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
-@@ -938,6 +957,7 @@
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-+	void (*umount_lustre) (struct super_block *);
- 
- 	/* Following are for knfsd to interact with "interesting" filesystems
- 	 * Currently just reiserfs, but possibly FAT and others later
-@@ -1094,10 +1113,16 @@ static inline int get_lease(struct inode
- 
- asmlinkage long sys_open(const char *, int, int);
- asmlinkage long sys_close(unsigned int);	/* yes, it's really unsigned */
--extern int do_truncate(struct dentry *, loff_t start);
-+extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
-+struct dentry *lookup_create(struct nameidata *nd, int is_dir,
-+				    struct lookup_intent *it);
- 
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
-+extern int open_namei_it(const char *filename, int namei_flags, int mode,
-+			 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 filp_close(struct file *, fl_owner_t id);
- extern char * getname(const char *);
- 
-@@ -1388,6 +1411,7 @@ typedef int (*read_actor_t)(read_descrip
- extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
- 
- extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
-+extern int FASTCALL(__user_walk_it(const char *, unsigned, struct nameidata *, struct lookup_intent *it));
- extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *));
- extern int FASTCALL(path_walk(const char *, struct nameidata *));
- extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *));
-@@ -1399,6 +1423,8 @@ extern struct dentry * lookup_one_len(co
- 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)
-+#define user_path_walk_it(name,nd,it)  __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it)
-+#define user_path_walk_link_it(name,nd,it) __user_walk_it(name, LOOKUP_POSITIVE, nd, it)
- 
- extern void inode_init_once(struct inode *);
- extern void iput(struct inode *);
-@@ -1538,6 +1564,8 @@ extern struct file_operations generic_ro
- 
- extern int vfs_readlink(struct dentry *, char *, int, const char *);
- extern int vfs_follow_link(struct nameidata *, const char *);
-+extern int vfs_follow_link_it(struct nameidata *, const char *,
-+			      struct lookup_intent *it);
- extern int page_readlink(struct dentry *, char *, int);
- extern int page_follow_link(struct dentry *, struct nameidata *);
- extern struct inode_operations page_symlink_inode_operations;
---- linux-2.4.22-ac1/include/linux/fs_struct.h~vfs_intent-2.4.22-rh	2003-09-25 14:16:24.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/fs_struct.h	2003-09-25 14:42:46.000000000 +0400
-@@ -37,10 +37,12 @@ static inline void set_fs_root(struct fs
- 	write_lock(&fs->lock);
- 	old_root = fs->root;
- 	old_rootmnt = fs->rootmnt;
-+	PIN(dentry, mnt, 1);
- 	fs->rootmnt = mntget(mnt);
- 	fs->root = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_root) {
-+		UNPIN(old_root, old_rootmnt, 1);
- 		dput(old_root);
- 		mntput(old_rootmnt);
- 	}
-@@ -60,10 +62,12 @@ static inline void set_fs_pwd(struct fs_
- 	write_lock(&fs->lock);
- 	old_pwd = fs->pwd;
- 	old_pwdmnt = fs->pwdmnt;
-+	PIN(dentry, mnt, 0);
- 	fs->pwdmnt = mntget(mnt);
- 	fs->pwd = dget(dentry);
- 	write_unlock(&fs->lock);
- 	if (old_pwd) {
-+		UNPIN(old_pwd, old_pwdmnt, 0);
- 		dput(old_pwd);
- 		mntput(old_pwdmnt);
- 	}
---- linux-2.4.22-ac1/kernel/exit.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/kernel/exit.c	2003-09-25 14:42:46.000000000 +0400
-@@ -342,11 +342,14 @@ static inline void __put_fs_struct(struc
- {
- 	/* No need to hold fs->lock if we are killing it */
- 	if (atomic_dec_and_test(&fs->count)) {
-+		UNPIN(fs->pwd, fs->pwdmnt, 0);
-+		UNPIN(fs->root, fs->rootmnt, 1);
- 		dput(fs->root);
- 		mntput(fs->rootmnt);
- 		dput(fs->pwd);
- 		mntput(fs->pwdmnt);
- 		if (fs->altroot) {
-+			UNPIN(fs->altroot, fs->altrootmnt, 1);
- 			dput(fs->altroot);
- 			mntput(fs->altrootmnt);
- 		}
---- linux-2.4.22-ac1/kernel/fork.c~vfs_intent-2.4.22-rh	2003-09-25 14:16:28.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/kernel/fork.c	2003-09-25 14:42:46.000000000 +0400
-@@ -457,10 +457,13 @@ static inline struct fs_struct *__copy_f
- 		fs->umask = old->umask;
- 		read_lock(&old->lock);
- 		fs->rootmnt = mntget(old->rootmnt);
-+		PIN(old->pwd, old->pwdmnt, 0);
-+		PIN(old->root, old->rootmnt, 1);
- 		fs->root = dget(old->root);
- 		fs->pwdmnt = mntget(old->pwdmnt);
- 		fs->pwd = dget(old->pwd);
- 		if (old->altroot) {
-+			PIN(old->altroot, old->altrootmnt, 1);
- 			fs->altrootmnt = mntget(old->altrootmnt);
- 			fs->altroot = dget(old->altroot);
- 		} else {
---- linux-2.4.22-ac1/kernel/ksyms.c~vfs_intent-2.4.22-rh	2003-09-25 14:39:02.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/kernel/ksyms.c	2003-09-25 14:42:46.000000000 +0400
-@@ -295,6 +295,9 @@ EXPORT_SYMBOL(read_cache_page);
- EXPORT_SYMBOL(set_page_dirty);
- EXPORT_SYMBOL(vfs_readlink);
- EXPORT_SYMBOL(vfs_follow_link);
-+EXPORT_SYMBOL(vfs_follow_link_it);
-+EXPORT_SYMBOL(do_umount);
-+EXPORT_SYMBOL(lookup_create);
- EXPORT_SYMBOL(page_readlink);
- EXPORT_SYMBOL(page_follow_link);
- EXPORT_SYMBOL(page_symlink_inode_operations);
-
-Index: linux-2.4.24/include/linux/mount.h
-===================================================================
---- linux-2.4.22-ac1/include/linux/mount.h	2004-05-03 19:56:48.182871712 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/mount.h	2004-05-03 20:00:02.831280656 +0300
-@@ -29,6 +29,8 @@
- 	int mnt_flags;
- 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
- 	struct list_head mnt_list;
-+	struct list_head mnt_lustre_list; /* GNS mount list */
-+	unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
- };
- 
- static inline struct vfsmount *mntget(struct vfsmount *mnt)
-@@ -39,6 +41,7 @@
- }
- 
- extern void __mntput(struct vfsmount *mnt);
-+extern int do_umount(struct vfsmount *mnt, int flags);
- 
- static inline void mntput(struct vfsmount *mnt)
- {
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.24.patch
old mode 100644
new mode 100755
similarity index 100%
rename from lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch
rename to lustre/kernel_patches/patches/vfs_intent-2.4.24.patch
diff --git a/lustre/kernel_patches/patches/vfs_intent-2.6-vanilla.patch b/lustre/kernel_patches/patches/vfs_intent-2.6-vanilla.patch
new file mode 100644
index 0000000000..d1a7e7bc9c
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_intent-2.6-vanilla.patch
@@ -0,0 +1,840 @@
+Index: linux-2.6.7/fs/exec.c
+===================================================================
+--- linux-2.6.7.orig/fs/exec.c	2004-06-16 13:19:13.000000000 +0800
++++ linux-2.6.7/fs/exec.c	2004-09-06 21:03:22.000000000 +0800
+@@ -121,9 +121,10 @@
+ 	struct file * file;
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_OPEN);
+ 
+-	nd.intent.open.flags = FMODE_READ;
+-	error = __user_walk(library, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
++	nd.intent.it_flags = FMODE_READ|FMODE_EXEC;
++	error = __user_walk_it(library, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
+ 	if (error)
+ 		goto out;
+ 
+@@ -135,7 +136,7 @@
+ 	if (error)
+ 		goto exit;
+ 
+-	file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++	file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+ 	error = PTR_ERR(file);
+ 	if (IS_ERR(file))
+ 		goto out;
+@@ -474,8 +475,9 @@
+ 	int err;
+ 	struct file *file;
+ 
+-	nd.intent.open.flags = FMODE_READ;
+-	err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
++	intent_init(&nd.intent, IT_OPEN);
++	nd.intent.it_flags = FMODE_READ|FMODE_EXEC;
++	err = path_lookup(name, LOOKUP_FOLLOW, &nd);
+ 	file = ERR_PTR(err);
+ 
+ 	if (!err) {
+@@ -488,7 +490,7 @@
+ 				err = -EACCES;
+ 			file = ERR_PTR(err);
+ 			if (!err) {
+-				file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
++				file = dentry_open_it(nd.dentry, nd.mnt, O_RDONLY, &nd.intent);
+ 				if (!IS_ERR(file)) {
+ 					err = deny_write_access(file);
+ 					if (err) {
+Index: linux-2.6.7/fs/namei.c
+===================================================================
+--- linux-2.6.7.orig/fs/namei.c	2004-06-16 13:19:12.000000000 +0800
++++ linux-2.6.7/fs/namei.c	2004-09-06 21:03:22.000000000 +0800
+@@ -272,8 +272,19 @@
+ 	return 0;
+ }
+ 
++void intent_release(struct lookup_intent *it)
++{
++	if (!it)
++		return;
++	if (it->it_magic != INTENT_MAGIC)
++		return;
++	if (it->it_op_release)
++		it->it_op_release(it);
++}
++
+ void path_release(struct nameidata *nd)
+ {
++	intent_release(&nd->intent);
+ 	dput(nd->dentry);
+ 	mntput(nd->mnt);
+ }
+@@ -350,7 +361,10 @@
+ {
+ 	struct dentry * result;
+ 	struct inode *dir = parent->d_inode;
++	int counter = 0;
+ 
++again:
++	counter++;
+ 	down(&dir->i_sem);
+ 	/*
+ 	 * First re-do the cached lookup just in case it was created
+@@ -389,7 +403,10 @@
+ 	if (result->d_op && result->d_op->d_revalidate) {
+ 		if (!result->d_op->d_revalidate(result, nd) && !d_invalidate(result)) {
+ 			dput(result);
+-			result = ERR_PTR(-ENOENT);
++			if (counter > 10)
++				result = ERR_PTR(-ESTALE);
++			if (!IS_ERR(result))
++				goto again;
+ 		}
+ 	}
+ 	return result;
+@@ -566,6 +583,33 @@
+ 	return PTR_ERR(dentry);
+ }
+ 
++static int revalidate_special(struct nameidata *nd)
++{
++	struct dentry *dentry = nd->dentry;
++	int err, counter = 0;
++
++	if (!dentry->d_op || !dentry->d_op->d_revalidate)
++		return 0;
++ revalidate_again:
++	if (!dentry->d_op->d_revalidate(dentry, nd)) {
++		struct dentry *new;
++		if ((err = permission(dentry->d_parent->d_inode, MAY_EXEC, nd)))
++			return err;
++		new = real_lookup(dentry->d_parent, &dentry->d_name, nd);
++		if (IS_ERR(new))
++			return PTR_ERR(new);
++		d_invalidate(dentry);
++		dput(dentry);
++		nd->dentry = dentry = new;
++		counter++;
++		if (counter < 10)
++			goto revalidate_again;
++		printk("excessive revalidate_it loops\n");
++		return -ESTALE;
++	}
++	return 0;
++}
++
+ /*
+  * Name resolution.
+  *
+@@ -666,7 +710,9 @@
+ 
+ 		if (inode->i_op->follow_link) {
+ 			mntget(next.mnt);
++			nd->flags |= LOOKUP_LINK_NOTLAST;
+ 			err = do_follow_link(next.dentry, nd);
++			nd->flags &= ~LOOKUP_LINK_NOTLAST;
+ 			dput(next.dentry);
+ 			mntput(next.mnt);
+ 			if (err)
+@@ -705,14 +751,26 @@
+ 				inode = nd->dentry->d_inode;
+ 				/* fallthrough */
+ 			case 1:
++ 				nd->flags |= LOOKUP_LAST;
++ 				err = revalidate_special(nd);
++ 				nd->flags &= ~LOOKUP_LAST;
++				if (!nd->dentry->d_inode)
++					err = -ENOENT;
++				if (err) {
++ 					path_release(nd);
++					goto return_err;
++				}
+ 				goto return_reval;
+ 		}
++		
+ 		if (nd->dentry->d_op && nd->dentry->d_op->d_hash) {
+ 			err = nd->dentry->d_op->d_hash(nd->dentry, &this);
+ 			if (err < 0)
+ 				break;
+ 		}
++		nd->flags |= LOOKUP_LAST;
+ 		err = do_lookup(nd, &this, &next);
++		nd->flags &= ~LOOKUP_LAST;
+ 		if (err)
+ 			break;
+ 		follow_mount(&next.mnt, &next.dentry);
+@@ -946,7 +1004,7 @@
+ }
+ 
+ /* SMP-safe */
+-struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++struct dentry * lookup_one_len_it(const char * name, struct dentry * base, int len, struct nameidata *nd)
+ {
+ 	unsigned long hash;
+ 	struct qstr this;
+@@ -966,11 +1024,16 @@
+ 	}
+ 	this.hash = end_name_hash(hash);
+ 
+-	return lookup_hash(&this, base);
++	return __lookup_hash(&this, base, nd);
+ access:
+ 	return ERR_PTR(-EACCES);
+ }
+ 
++struct dentry * lookup_one_len(const char * name, struct dentry * base, int len)
++{
++	return lookup_one_len_it(name, base, len, NULL);
++}
++
+ /*
+  *	namei()
+  *
+@@ -982,7 +1045,7 @@
+  * that namei follows links, while lnamei does not.
+  * SMP-safe
+  */
+-int fastcall __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++int fastcall __user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd)
+ {
+ 	char *tmp = getname(name);
+ 	int err = PTR_ERR(tmp);
+@@ -994,6 +1057,12 @@
+ 	return err;
+ }
+ 
++int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
++{
++	intent_init(&nd->intent, IT_LOOKUP);
++	return __user_walk_it(name, flags, nd);
++}
++
+ /*
+  * It's inline, so penalty for filesystems that don't use sticky bit is
+  * minimal.
+@@ -1266,8 +1335,8 @@
+ 		acc_mode |= MAY_APPEND;
+ 
+ 	/* Fill in the open() intent data */
+-	nd->intent.open.flags = flag;
+-	nd->intent.open.create_mode = mode;
++	nd->intent.it_flags = flag;
++	nd->intent.it_create_mode = mode;
+ 
+ 	/*
+ 	 * The simplest case - just a plain lookup.
+@@ -1282,6 +1351,7 @@
+ 	/*
+ 	 * Create - we need to know the parent.
+ 	 */
++	nd->intent.it_op |= IT_CREAT;
+ 	error = path_lookup(pathname, LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE, nd);
+ 	if (error)
+ 		return error;
+@@ -1298,7 +1368,9 @@
+ 	dir = nd->dentry;
+ 	nd->flags &= ~LOOKUP_PARENT;
+ 	down(&dir->d_inode->i_sem);
++	nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++	nd->flags &= ~LOOKUP_LAST;
+ 
+ do_last:
+ 	error = PTR_ERR(dentry);
+@@ -1403,7 +1475,9 @@
+ 	}
+ 	dir = nd->dentry;
+ 	down(&dir->d_inode->i_sem);
++	nd->flags |= LOOKUP_LAST;
+ 	dentry = __lookup_hash(&nd->last, nd->dentry, nd);
++	nd->flags &= ~LOOKUP_LAST;
+ 	putname(nd->last.name);
+ 	goto do_last;
+ }
+@@ -2165,7 +2239,9 @@
+ __vfs_follow_link(struct nameidata *nd, const char *link)
+ {
+ 	int res = 0;
++	struct lookup_intent it = nd->intent;
+ 	char *name;
++
+ 	if (IS_ERR(link))
+ 		goto fail;
+ 
+@@ -2175,6 +2251,10 @@
+ 			/* weird __emul_prefix() stuff did it */
+ 			goto out;
+ 	}
++
++	intent_init(&nd->intent, it.it_op);
++	nd->intent.it_flags = it.it_flags;
++	nd->intent.it_create_mode = it.it_create_mode;
+ 	res = link_path_walk(link, nd);
+ out:
+ 	if (current->link_count || res || nd->last_type!=LAST_NORM)
+Index: linux-2.6.7/fs/namespace.c
+===================================================================
+--- linux-2.6.7.orig/fs/namespace.c	2004-06-16 13:19:37.000000000 +0800
++++ linux-2.6.7/fs/namespace.c	2004-09-06 21:03:22.000000000 +0800
+@@ -60,6 +60,7 @@
+ 		INIT_LIST_HEAD(&mnt->mnt_child);
+ 		INIT_LIST_HEAD(&mnt->mnt_mounts);
+ 		INIT_LIST_HEAD(&mnt->mnt_list);
++		INIT_LIST_HEAD(&mnt->mnt_lustre_list);
+ 		if (name) {
+ 			int size = strlen(name)+1;
+ 			char *newname = kmalloc(size, GFP_KERNEL);
+@@ -117,6 +118,7 @@
+ 
+ static void detach_mnt(struct vfsmount *mnt, struct nameidata *old_nd)
+ {
++	memset(old_nd, 0, sizeof(*old_nd));
+ 	old_nd->dentry = mnt->mnt_mountpoint;
+ 	old_nd->mnt = mnt->mnt_parent;
+ 	mnt->mnt_parent = mnt;
+@@ -172,6 +174,9 @@
+ {
+ 	struct super_block *sb = mnt->mnt_sb;
+ 	dput(mnt->mnt_root);
++        spin_lock(&dcache_lock);
++        list_del(&mnt->mnt_lustre_list);
++        spin_unlock(&dcache_lock);
+ 	free_vfsmnt(mnt);
+ 	deactivate_super(sb);
+ }
+@@ -379,6 +384,8 @@
+ 	 */
+ 
+ 	lock_kernel();
++	if (sb->s_op->umount_lustre)
++              sb->s_op->umount_lustre(sb);
+ 	if( (flags&MNT_FORCE) && sb->s_op->umount_begin)
+ 		sb->s_op->umount_begin(sb);
+ 	unlock_kernel();
+@@ -603,6 +610,7 @@
+ 		return err;
+ 	if (!old_name || !*old_name)
+ 		return -EINVAL;
++	intent_init(&old_nd.intent, IT_LOOKUP);
+ 	err = path_lookup(old_name, LOOKUP_FOLLOW, &old_nd);
+ 	if (err)
+ 		return err;
+@@ -671,6 +679,7 @@
+ 		return -EPERM;
+ 	if (!old_name || !*old_name)
+ 		return -EINVAL;
++	intent_init(&old_nd.intent, IT_LOOKUP);
+ 	err = path_lookup(old_name, LOOKUP_FOLLOW, &old_nd);
+ 	if (err)
+ 		return err;
+@@ -820,6 +829,7 @@
+ 	int retval = 0;
+ 	int mnt_flags = 0;
+ 
++	intent_init(&nd.intent, IT_LOOKUP);
+ 	/* Discard magic */
+ 	if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
+ 		flags &= ~MS_MGC_MSK;
+Index: linux-2.6.7/fs/open.c
+===================================================================
+--- linux-2.6.7.orig/fs/open.c	2004-06-16 13:18:56.000000000 +0800
++++ linux-2.6.7/fs/open.c	2004-09-06 21:03:22.000000000 +0800
+@@ -215,12 +215,12 @@
+ 	struct nameidata nd;
+ 	struct inode * inode;
+ 	int error;
+-
++	intent_init(&nd.intent, IT_GETATTR);
+ 	error = -EINVAL;
+ 	if (length < 0)	/* sorry, but loff_t says... */
+ 		goto out;
+ 
+-	error = user_path_walk(path, &nd);
++	error = user_path_walk_it(path, &nd);
+ 	if (error)
+ 		goto out;
+ 	inode = nd.dentry->d_inode;
+@@ -474,6 +474,7 @@
+ 	int old_fsuid, old_fsgid;
+ 	kernel_cap_t old_cap;
+ 	int res;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
+ 		return -EINVAL;
+@@ -498,13 +499,14 @@
+ 	else
+ 		current->cap_effective = current->cap_permitted;
+ 
+-	res = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd);
++	res = __user_walk_it(filename, LOOKUP_FOLLOW|LOOKUP_ACCESS, &nd);
+ 	if (!res) {
+ 		res = permission(nd.dentry->d_inode, mode, &nd);
+ 		/* SuS v2 requires we report a read only fs too */
+ 		if(!res && (mode & S_IWOTH) && IS_RDONLY(nd.dentry->d_inode)
+ 		   && !special_file(nd.dentry->d_inode->i_mode))
+ 			res = -EROFS;
++
+ 		path_release(&nd);
+ 	}
+ 
+@@ -519,8 +521,9 @@
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_CHDIR);
+ 
+-	error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
++	error = __user_walk_it(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
+ 	if (error)
+ 		goto out;
+ 
+@@ -570,8 +573,9 @@
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+-	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
++	error = __user_walk_it(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
+ 	if (error)
+ 		goto out;
+ 
+@@ -750,27 +754,8 @@
+  * for the internal routines (ie open_namei()/follow_link() etc). 00 is
+  * used by symlinks.
+  */
+-struct file *filp_open(const char * filename, int flags, int mode)
+-{
+-	int namei_flags, error;
+-	struct nameidata nd;
+-
+-	namei_flags = flags;
+-	if ((namei_flags+1) & O_ACCMODE)
+-		namei_flags++;
+-	if (namei_flags & O_TRUNC)
+-		namei_flags |= 2;
+-
+-	error = open_namei(filename, namei_flags, mode, &nd);
+-	if (!error)
+-		return dentry_open(nd.dentry, nd.mnt, flags);
+-
+-	return ERR_PTR(error);
+-}
+-
+-EXPORT_SYMBOL(filp_open);
+-
+-struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags,
++			    struct lookup_intent *it)
+ {
+ 	struct file * f;
+ 	struct inode *inode;
+@@ -782,6 +767,7 @@
+ 		goto cleanup_dentry;
+ 	f->f_flags = flags;
+ 	f->f_mode = (flags+1) & O_ACCMODE;
++	f->f_it = it;
+ 	inode = dentry->d_inode;
+ 	if (f->f_mode & FMODE_WRITE) {
+ 		error = get_write_access(inode);
+@@ -800,6 +786,7 @@
+ 		error = f->f_op->open(inode,f);
+ 		if (error)
+ 			goto cleanup_all;
++		intent_release(it);
+ 	}
+ 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
+ 
+@@ -825,6 +812,7 @@
+ cleanup_file:
+ 	put_filp(f);
+ cleanup_dentry:
++	intent_release(it);
+ 	dput(dentry);
+ 	mntput(mnt);
+ 	return ERR_PTR(error);
+@@ -832,6 +820,36 @@
+ 
+ EXPORT_SYMBOL(dentry_open);
+ 
++struct file *filp_open(const char * filename, int flags, int mode)
++{
++	int namei_flags, error;
++	struct file * temp_filp;
++	struct nameidata nd;
++	intent_init(&nd.intent, IT_OPEN);
++
++	namei_flags = flags;
++	if ((namei_flags+1) & O_ACCMODE)
++		namei_flags++;
++	if (namei_flags & O_TRUNC)
++		namei_flags |= 2;
++
++	error = open_namei(filename, namei_flags, mode, &nd);
++	if (!error) {
++		temp_filp = dentry_open_it(nd.dentry, nd.mnt, flags, &nd.intent);
++		return temp_filp;
++	}	
++	return ERR_PTR(error);
++}
++
++
++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)
++{
++	struct lookup_intent it;
++	intent_init(&it, IT_LOOKUP);
++
++	return dentry_open_it(dentry, mnt, flags, &it);
++}
++
+ /*
+  * Find an empty file descriptor entry, and mark it busy.
+  */
+Index: linux-2.6.7/fs/stat.c
+===================================================================
+--- linux-2.6.7.orig/fs/stat.c	2004-06-16 13:19:01.000000000 +0800
++++ linux-2.6.7/fs/stat.c	2004-09-06 21:03:22.000000000 +0800
+@@ -37,7 +37,7 @@
+ 
+ EXPORT_SYMBOL(generic_fillattr);
+ 
+-int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++int vfs_getattr_it(struct vfsmount *mnt, struct dentry *dentry, struct lookup_intent *it, struct kstat *stat)
+ {
+ 	struct inode *inode = dentry->d_inode;
+ 	int retval;
+@@ -46,6 +46,8 @@
+ 	if (retval)
+ 		return retval;
+ 
++	if (inode->i_op->getattr_it)
++		return inode->i_op->getattr_it(mnt, dentry, it, stat);
+ 	if (inode->i_op->getattr)
+ 		return inode->i_op->getattr(mnt, dentry, stat);
+ 
+@@ -62,14 +64,20 @@
+ 
+ EXPORT_SYMBOL(vfs_getattr);
+ 
++int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
++{
++	return vfs_getattr_it(mnt, dentry, NULL, stat);
++}
++
+ int vfs_stat(char __user *name, struct kstat *stat)
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+-	error = user_path_walk(name, &nd);
++	error = user_path_walk_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -81,10 +89,11 @@
+ {
+ 	struct nameidata nd;
+ 	int error;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+-	error = user_path_walk_link(name, &nd);
++	error = user_path_walk_link_it(name, &nd);
+ 	if (!error) {
+-		error = vfs_getattr(nd.mnt, nd.dentry, stat);
++		error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat);
+ 		path_release(&nd);
+ 	}
+ 	return error;
+@@ -96,9 +105,12 @@
+ {
+ 	struct file *f = fget(fd);
+ 	int error = -EBADF;
++	struct nameidata nd;
++	intent_init(&nd.intent, IT_GETATTR);
+ 
+ 	if (f) {
+-		error = vfs_getattr(f->f_vfsmnt, f->f_dentry, stat);
++		error = vfs_getattr_it(f->f_vfsmnt, f->f_dentry, &nd.intent, stat);
++		intent_release(&nd.intent);
+ 		fput(f);
+ 	}
+ 	return error;
+Index: linux-2.6.7/fs/nfs/dir.c
+===================================================================
+--- linux-2.6.7.orig/fs/nfs/dir.c	2004-06-16 13:19:23.000000000 +0800
++++ linux-2.6.7/fs/nfs/dir.c	2004-09-06 21:03:22.000000000 +0800
+@@ -705,7 +705,7 @@
+ 		return 0;
+ 	if (!nd || (nd->flags & LOOKUP_CONTINUE) || !(nd->flags & LOOKUP_CREATE))
+ 		return 0;
+-	return (nd->intent.open.flags & O_EXCL) != 0;
++	return (nd->intent.it_flags & O_EXCL) != 0;
+ }
+ 
+ static struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *nd)
+@@ -1022,7 +1022,7 @@
+ 	attr.ia_valid = ATTR_MODE;
+ 
+ 	if (nd && (nd->flags & LOOKUP_CREATE))
+-		open_flags = nd->intent.open.flags;
++		open_flags = nd->intent.it_flags;
+ 
+ 	/*
+ 	 * The 0 argument passed into the create function should one day
+Index: linux-2.6.7/fs/inode.c
+===================================================================
+--- linux-2.6.7.orig/fs/inode.c	2004-06-16 13:20:26.000000000 +0800
++++ linux-2.6.7/fs/inode.c	2004-09-06 21:03:22.000000000 +0800
+@@ -232,6 +232,7 @@
+ 	inodes_stat.nr_unused--;
+ }
+ 
++EXPORT_SYMBOL(__iget);
+ /**
+  * clear_inode - clear an inode
+  * @inode: inode to clear
+Index: linux-2.6.7/fs/super.c
+===================================================================
+--- linux-2.6.7.orig/fs/super.c	2004-06-16 13:19:22.000000000 +0800
++++ linux-2.6.7/fs/super.c	2004-09-06 21:03:22.000000000 +0800
+@@ -804,6 +804,8 @@
+ 	return (struct vfsmount *)sb;
+ }
+ 
++EXPORT_SYMBOL(do_kern_mount);
++
+ struct vfsmount *kern_mount(struct file_system_type *type)
+ {
+ 	return do_kern_mount(type->name, 0, type->name, NULL);
+Index: linux-2.6.7/include/linux/dcache.h
+===================================================================
+--- linux-2.6.7.orig/include/linux/dcache.h	2004-06-16 13:20:26.000000000 +0800
++++ linux-2.6.7/include/linux/dcache.h	2004-09-06 21:03:22.000000000 +0800
+@@ -4,6 +4,7 @@
+ #ifdef __KERNEL__
+ 
+ #include <asm/atomic.h>
++#include <linux/string.h>
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
+ #include <linux/cache.h>
+@@ -37,6 +38,8 @@
+ 	unsigned int len;
+ };
+ 
++#include <linux/namei.h>
++
+ struct dentry_stat_t {
+ 	int nr_dentry;
+ 	int nr_unused;
+Index: linux-2.6.7/include/linux/fs.h
+===================================================================
+--- linux-2.6.7.orig/include/linux/fs.h	2004-06-16 13:19:02.000000000 +0800
++++ linux-2.6.7/include/linux/fs.h	2004-09-06 21:03:22.000000000 +0800
+@@ -74,6 +74,7 @@
+ 
+ #define FMODE_READ 1
+ #define FMODE_WRITE 2
++#define FMODE_EXEC 4
+ 
+ #define RW_MASK		1
+ #define RWA_MASK	2
+@@ -250,6 +251,8 @@
+ #define ATTR_ATTR_FLAG	1024
+ #define ATTR_KILL_SUID	2048
+ #define ATTR_KILL_SGID	4096
++#define ATTR_RAW       	8192    /* file system, not vfs will massage attrs */
++#define ATTR_FROM_OPEN 	16384    /* called from open path, ie O_TRUNC */
+ 
+ /*
+  * This is the Inode Attributes structure, used for notify_change().  It
+@@ -446,6 +449,7 @@
+ 	struct block_device	*i_bdev;
+ 	struct cdev		*i_cdev;
+ 	int			i_cindex;
++	void			*i_filterdata;
+ 
+ 	unsigned long		i_dnotify_mask; /* Directory notify events */
+ 	struct dnotify_struct	*i_dnotify; /* for directory notifications */
+@@ -579,6 +583,7 @@
+ 	spinlock_t		f_ep_lock;
+ #endif /* #ifdef CONFIG_EPOLL */
+ 	struct address_space	*f_mapping;
++ 	struct lookup_intent    *f_it;
+ };
+ extern spinlock_t files_lock;
+ #define file_list_lock() spin_lock(&files_lock);
+@@ -903,7 +908,9 @@
+ 	void (*truncate) (struct inode *);
+ 	int (*permission) (struct inode *, int, struct nameidata *);
+ 	int (*setattr) (struct dentry *, struct iattr *);
++	int (*setattr_raw) (struct inode *, struct iattr *);
+ 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
++	int (*getattr_it) (struct vfsmount *, struct dentry *, struct lookup_intent *, struct kstat *);
+ 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
+ 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
+ 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
+@@ -943,6 +950,7 @@
+ 	int (*remount_fs) (struct super_block *, int *, char *);
+ 	void (*clear_inode) (struct inode *);
+ 	void (*umount_begin) (struct super_block *);
++	void (*umount_lustre) (struct super_block *);
+ 
+ 	int (*show_options)(struct seq_file *, struct vfsmount *);
+ };
+@@ -1131,6 +1139,7 @@
+ extern struct vfsmount *kern_mount(struct file_system_type *);
+ extern int may_umount_tree(struct vfsmount *);
+ extern int may_umount(struct vfsmount *);
++struct vfsmount *do_kern_mount(const char *type, int flags, const char *name, void *data);
+ extern long do_mount(char *, char *, char *, unsigned long, void *);
+ 
+ extern int vfs_statfs(struct super_block *, struct kstatfs *);
+@@ -1195,6 +1204,7 @@
+ extern int do_truncate(struct dentry *, loff_t start);
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
++extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
+ extern int filp_close(struct file *, fl_owner_t id);
+ extern char * getname(const char __user *);
+ 
+Index: linux-2.6.7/include/linux/namei.h
+===================================================================
+--- linux-2.6.7.orig/include/linux/namei.h	2004-06-16 13:19:10.000000000 +0800
++++ linux-2.6.7/include/linux/namei.h	2004-09-06 21:03:22.000000000 +0800
+@@ -2,25 +2,56 @@
+ #define _LINUX_NAMEI_H
+ 
+ #include <linux/linkage.h>
++#include <linux/string.h>
+ 
+ struct vfsmount;
++struct nameidata;
+ 
+-struct open_intent {
+-	int	flags;
+-	int	create_mode;
++/* intent opcodes */
++#define IT_OPEN     (1)
++#define IT_CREAT    (1<<1)
++#define IT_READDIR  (1<<2)
++#define IT_GETATTR  (1<<3)
++#define IT_LOOKUP   (1<<4)
++#define IT_UNLINK   (1<<5)
++#define IT_TRUNC    (1<<6)
++#define IT_GETXATTR (1<<7)
++#define IT_CHDIR    (1<<8)
++
++struct lustre_intent_data {
++	int       it_disposition;
++	int       it_status;
++	__u64     it_lock_handle;
++	void     *it_data;
++	int       it_lock_mode;
+ };
+ 
++#define INTENT_MAGIC 0x19620323
++struct lookup_intent {
++	int     it_magic;
++	void    (*it_op_release)(struct lookup_intent *);
++	int     it_op;
++	int	it_flags;
++	int	it_create_mode;
++	union {
++		struct lustre_intent_data lustre;
++	} d;
++};
++
++static inline void intent_init(struct lookup_intent *it, int op)
++{
++	memset(it, 0, sizeof(*it));
++	it->it_magic = INTENT_MAGIC;
++	it->it_op = op;
++}
++
+ struct nameidata {
+ 	struct dentry	*dentry;
+ 	struct vfsmount *mnt;
+ 	struct qstr	last;
+ 	unsigned int	flags;
+ 	int		last_type;
+-
+-	/* Intent data */
+-	union {
+-		struct open_intent open;
+-	} intent;
++	struct lookup_intent intent;
+ };
+ 
+ /*
+@@ -41,6 +72,9 @@
+ #define LOOKUP_CONTINUE		 4
+ #define LOOKUP_PARENT		16
+ #define LOOKUP_NOALT		32
++#define LOOKUP_LAST		 (1<<6)
++#define LOOKUP_LINK_NOTLAST	 (1<<7)
++
+ /*
+  * Intent data
+  */
+@@ -49,6 +83,12 @@
+ #define LOOKUP_ACCESS		(0x0400)
+ 
+ extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *));
++extern int FASTCALL(__user_walk_it(const char __user *name, unsigned flags, struct nameidata *nd));
++#define user_path_walk_it(name,nd) \
++	__user_walk_it(name, LOOKUP_FOLLOW, nd)
++#define user_path_walk_link_it(name,nd) \
++	__user_walk_it(name, 0, nd)
++extern void intent_release(struct lookup_intent *);
+ #define user_path_walk(name,nd) \
+ 	__user_walk(name, LOOKUP_FOLLOW, nd)
+ #define user_path_walk_link(name,nd) \
+@@ -60,7 +100,6 @@
+ 
+ extern struct dentry * lookup_one_len(const char *, struct dentry *, int);
+ extern struct dentry * lookup_hash(struct qstr *, struct dentry *);
+-
+ extern int follow_down(struct vfsmount **, struct dentry **);
+ extern int follow_up(struct vfsmount **, struct dentry **);
+ 
+Index: linux-2.6.7/include/linux/mount.h
+===================================================================
+--- linux-2.6.7.orig/include/linux/mount.h	2004-06-16 13:18:57.000000000 +0800
++++ linux-2.6.7/include/linux/mount.h	2004-09-06 21:05:29.000000000 +0800
+@@ -31,6 +31,8 @@
+ 	int mnt_flags;
+ 	char *mnt_devname;		/* Name of device e.g. /dev/dsk/hda1 */
+ 	struct list_head mnt_list;
++        struct list_head mnt_lustre_list; /* GNS mount list */
++        unsigned long mnt_last_used;      /* for GNS auto-umount (jiffies) */
+ };
+ 
+ static inline struct vfsmount *mntget(struct vfsmount *mnt)
+Index: linux-2.6.7/kernel/exit.c
+===================================================================
+--- linux-2.6.7.orig/kernel/exit.c	2004-06-16 13:19:52.000000000 +0800
++++ linux-2.6.7/kernel/exit.c	2004-09-06 21:03:22.000000000 +0800
+@@ -256,6 +256,8 @@
+ 	write_unlock_irq(&tasklist_lock);
+ }
+ 
++EXPORT_SYMBOL(reparent_to_init);
++
+ void __set_special_pids(pid_t session, pid_t pgrp)
+ {
+ 	struct task_struct *curr = current;
+@@ -436,6 +438,8 @@
+ 	__exit_files(tsk);
+ }
+ 
++EXPORT_SYMBOL(exit_files);
++
+ static inline void __put_fs_struct(struct fs_struct *fs)
+ {
+ 	/* No need to hold fs->lock if we are killing it */
diff --git a/lustre/kernel_patches/patches/vfs_nointent-2.6-vanilla.patch b/lustre/kernel_patches/patches/vfs_nointent-2.6-vanilla.patch
new file mode 100644
index 0000000000..a2dab5108f
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_nointent-2.6-vanilla.patch
@@ -0,0 +1,509 @@
+ 0 files changed
+
+.old..........pc/vfs_nointent_2.6.0-suse/fs/namei.c
+.new.........fs/namei.c
+Index: linux-2.6.4-51.0/fs/namei.c
+===================================================================
+--- linux-2.6.4-51.0.orig/fs/namei.c	2004-04-05 17:36:42.000000000 -0400
++++ linux-2.6.4-51.0/fs/namei.c	2004-04-05 17:36:43.000000000 -0400
+@@ -1276,7 +1276,7 @@
+ 		if (!error) {
+ 			DQUOT_INIT(inode);
+ 			
+-			error = do_truncate(dentry, 0);
++			error = do_truncate(dentry, 0, 1);
+ 		}
+ 		put_write_access(inode);
+ 		if (error)
+@@ -1526,6 +1526,7 @@
+ 	char * tmp;
+ 	struct dentry * dentry;
+ 	struct nameidata nd;
++	intent_init(&nd.intent, IT_LOOKUP);
+ 
+ 	if (S_ISDIR(mode))
+ 		return -EPERM;
+@@ -1536,6 +1537,15 @@
+ 	error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 	if (error)
+ 		goto out;
++
++	if (nd.dentry->d_inode->i_op->mknod_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++		error = op->mknod_raw(&nd, mode, dev);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto out2;
++	}
++
+ 	dentry = lookup_create(&nd, 0);
+ 	error = PTR_ERR(dentry);
+ 
+@@ -1562,6 +1572,7 @@
+ 		dput(dentry);
+ 	}
+ 	up(&nd.dentry->d_inode->i_sem);
++out2:
+ 	path_release(&nd);
+ out:
+ 	putname(tmp);
+@@ -1603,10 +1614,18 @@
+ 	if (!IS_ERR(tmp)) {
+ 		struct dentry *dentry;
+ 		struct nameidata nd;
++                intent_init(&nd.intent, IT_LOOKUP);
+ 
+ 		error = path_lookup(tmp, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
++ 		if (nd.dentry->d_inode->i_op->mkdir_raw) {
++ 			struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 			error = op->mkdir_raw(&nd, mode);
++ 			/* the file system wants to use normal vfs path now */
++ 			if (error != -EOPNOTSUPP)
++ 				goto out2;
++ 		}
+ 		dentry = lookup_create(&nd, 1);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+@@ -1616,6 +1635,7 @@
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(tmp);
+@@ -1696,6 +1716,7 @@
+ 	char * name;
+ 	struct dentry *dentry;
+ 	struct nameidata nd;
++        intent_init(&nd.intent, IT_LOOKUP);
+ 
+ 	name = getname(pathname);
+ 	if(IS_ERR(name))
+@@ -1716,6 +1737,16 @@
+ 			error = -EBUSY;
+ 			goto exit1;
+ 	}
++ 
++ 	if (nd.dentry->d_inode->i_op->rmdir_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 
++ 		error = op->rmdir_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
++ 
+ 	down(&nd.dentry->d_inode->i_sem);
+ 	dentry = lookup_hash(&nd.last, nd.dentry);
+ 	error = PTR_ERR(dentry);
+@@ -1774,6 +1805,7 @@
+ 	struct dentry *dentry;
+ 	struct nameidata nd;
+ 	struct inode *inode = NULL;
++        intent_init(&nd.intent, IT_LOOKUP);
+ 
+ 	name = getname(pathname);
+ 	if(IS_ERR(name))
+@@ -1785,6 +1817,13 @@
+ 	error = -EISDIR;
+ 	if (nd.last_type != LAST_NORM)
+ 		goto exit1;
++ 	if (nd.dentry->d_inode->i_op->unlink_raw) {
++ 		struct inode_operations *op = nd.dentry->d_inode->i_op;
++ 		error = op->unlink_raw(&nd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit1;
++ 	}
+ 	down(&nd.dentry->d_inode->i_sem);
+ 	dentry = lookup_hash(&nd.last, nd.dentry);
+ 	error = PTR_ERR(dentry);
+@@ -1852,10 +1891,18 @@
+ 	if (!IS_ERR(to)) {
+ 		struct dentry *dentry;
+ 		struct nameidata nd;
++                intent_init(&nd.intent, IT_LOOKUP);
+ 
+ 		error = path_lookup(to, LOOKUP_PARENT, &nd);
+ 		if (error)
+ 			goto out;
++		if (nd.dentry->d_inode->i_op->symlink_raw) {
++			struct inode_operations *op = nd.dentry->d_inode->i_op;
++			error = op->symlink_raw(&nd, from);
++			/* the file system wants to use normal vfs path now */
++			if (error != -EOPNOTSUPP)
++				goto out2;
++		}
+ 		dentry = lookup_create(&nd, 0);
+ 		error = PTR_ERR(dentry);
+ 		if (!IS_ERR(dentry)) {
+@@ -1863,6 +1910,7 @@
+ 			dput(dentry);
+ 		}
+ 		up(&nd.dentry->d_inode->i_sem);
++out2:
+ 		path_release(&nd);
+ out:
+ 		putname(to);
+@@ -1926,6 +1974,8 @@
+ 	struct nameidata nd, old_nd;
+ 	int error;
+ 	char * to;
++        intent_init(&nd.intent, IT_LOOKUP);
++        intent_init(&old_nd.intent, IT_LOOKUP);
+ 
+ 	to = getname(newname);
+ 	if (IS_ERR(to))
+@@ -1940,6 +1990,13 @@
+ 	error = -EXDEV;
+ 	if (old_nd.mnt != nd.mnt)
+ 		goto out_release;
++        if (nd.dentry->d_inode->i_op->link_raw) {
++                struct inode_operations *op = nd.dentry->d_inode->i_op;
++                error = op->link_raw(&old_nd, &nd);
++                /* the file system wants to use normal vfs path now */
++                if (error != -EOPNOTSUPP)
++                        goto out_release;
++        }
+ 	new_dentry = lookup_create(&nd, 0);
+ 	error = PTR_ERR(new_dentry);
+ 	if (!IS_ERR(new_dentry)) {
+@@ -1990,7 +2047,7 @@
+  *	   locking].
+  */
+ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++                   struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	int error = 0;
+ 	struct inode *target;
+@@ -2035,7 +2092,7 @@
+ }
+ 
+ int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
+-	       struct inode *new_dir, struct dentry *new_dentry)
++                     struct inode *new_dir, struct dentry *new_dentry)
+ {
+ 	struct inode *target;
+ 	int error;
+@@ -2112,6 +2169,8 @@
+ 	struct dentry * old_dentry, *new_dentry;
+ 	struct dentry * trap;
+ 	struct nameidata oldnd, newnd;
++        intent_init(&oldnd.intent, IT_LOOKUP);
++        intent_init(&newnd.intent, IT_LOOKUP);
+ 
+ 	error = path_lookup(oldname, LOOKUP_PARENT, &oldnd);
+ 	if (error)
+@@ -2134,6 +2193,13 @@
+ 	if (newnd.last_type != LAST_NORM)
+ 		goto exit2;
+ 
++ 	if (old_dir->d_inode->i_op->rename_raw) {
++ 		error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
++ 		/* the file system wants to use normal vfs path now */
++ 		if (error != -EOPNOTSUPP)
++ 			goto exit2;
++ 	}
++
+ 	trap = lock_rename(new_dir, old_dir);
+ 
+ 	old_dentry = lookup_hash(&oldnd.last, old_dir);
+@@ -2165,8 +2231,7 @@
+ 	if (new_dentry == trap)
+ 		goto exit5;
+ 
+-	error = vfs_rename(old_dir->d_inode, old_dentry,
+-				   new_dir->d_inode, new_dentry);
++	error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry);
+ exit5:
+ 	dput(new_dentry);
+ exit4:
+Index: linux-2.6.4-51.0/fs/open.c
+===================================================================
+--- linux-2.6.4-51.0.orig/fs/open.c	2004-04-05 17:36:42.000000000 -0400
++++ linux-2.6.4-51.0/fs/open.c	2004-04-06 01:37:39.000000000 -0400
+@@ -187,9 +187,10 @@
+ 	return error;
+ }
+ 
+-int do_truncate(struct dentry *dentry, loff_t length)
++int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
+ {
+ 	int err;
++	struct inode_operations *op = dentry->d_inode->i_op;
+ 	struct iattr newattrs;
+ 
+ 	/* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
+@@ -200,7 +201,14 @@
+ 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
+ 	down(&dentry->d_inode->i_sem);
+ 	down_write(&dentry->d_inode->i_alloc_sem);
+-	err = notify_change(dentry, &newattrs);
++	if (called_from_open)
++		newattrs.ia_valid |= ATTR_FROM_OPEN;
++	if (op->setattr_raw) {
++		newattrs.ia_valid |= ATTR_RAW;
++		newattrs.ia_ctime = CURRENT_TIME;
++		err = op->setattr_raw(dentry->d_inode, &newattrs);
++	} else
++		err = notify_change(dentry, &newattrs);
+ 	up_write(&dentry->d_inode->i_alloc_sem);
+ 	up(&dentry->d_inode->i_sem);
+ 	return err;
+@@ -256,7 +264,7 @@
+ 	error = locks_verify_truncate(inode, NULL, length);
+ 	if (!error) {
+ 		DQUOT_INIT(inode);
+-		error = do_truncate(nd.dentry, length);
++		error = do_truncate(nd.dentry, length, 0);
+ 	}
+ 	put_write_access(inode);
+ 
+@@ -308,7 +316,7 @@
+ 
+ 	error = locks_verify_truncate(inode, file, length);
+ 	if (!error)
+-		error = do_truncate(dentry, length);
++		error = do_truncate(dentry, length, 0);
+ out_putf:
+ 	fput(file);
+ out:
+@@ -387,9 +395,19 @@
+ 		    (error = permission(inode,MAY_WRITE,&nd)) != 0)
+ 			goto dput_and_out;
+ 	}
+-	down(&inode->i_sem);
+-	error = notify_change(nd.dentry, &newattrs);
+-	up(&inode->i_sem);
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	} else {
++                down(&inode->i_sem);
++                error = notify_change(nd.dentry, &newattrs);
++                up(&inode->i_sem);
++        }
+ dput_and_out:
+ 	path_release(&nd);
+ out:
+@@ -440,9 +458,19 @@
+ 		    (error = permission(inode,MAY_WRITE,&nd)) != 0)
+ 			goto dput_and_out;
+ 	}
+-	down(&inode->i_sem);
+-	error = notify_change(nd.dentry, &newattrs);
+-	up(&inode->i_sem);
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = nd.dentry->d_inode->i_op;
++
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto dput_and_out;
++	} else {
++                down(&inode->i_sem);
++                error = notify_change(nd.dentry, &newattrs);
++                up(&inode->i_sem);
++        }
+ dput_and_out:
+ 	path_release(&nd);
+ out:
+@@ -592,36 +620,52 @@
+ 	return error;
+ }
+ 
+-asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
++int chmod_common(struct dentry *dentry, mode_t mode)
+ {
+-	struct inode * inode;
+-	struct dentry * dentry;
+-	struct file * file;
+-	int err = -EBADF;
++	struct inode * inode = dentry->d_inode;
+ 	struct iattr newattrs;
++	int error = -EROFS;
+ 
+-	file = fget(fd);
+-	if (!file)
++	if (IS_RDONLY(inode))
+ 		goto out;
++	
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = dentry->d_inode->i_op;
+ 
+-	dentry = file->f_dentry;
+-	inode = dentry->d_inode;
++		newattrs.ia_mode = mode;
++		newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			goto out;
++	}
+ 
+-	err = -EROFS;
+-	if (IS_RDONLY(inode))
+-		goto out_putf;
+-	err = -EPERM;
++	error = -EPERM;
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+-		goto out_putf;
++		goto out;
++
+ 	down(&inode->i_sem);
+ 	if (mode == (mode_t) -1)
+ 		mode = inode->i_mode;
+ 	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
+ 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
+-	err = notify_change(dentry, &newattrs);
++	error = notify_change(dentry, &newattrs);
+ 	up(&inode->i_sem);
++out:
++	return error;
++}
+ 
+-out_putf:
++asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
++{
++	struct file * file;
++	int err = -EBADF;
++
++	file = fget(fd);
++	if (!file)
++		goto out;
++
++	err = chmod_common(file->f_dentry, mode);
+ 	fput(file);
+ out:
+ 	return err;
+@@ -630,32 +674,13 @@
+ asmlinkage long sys_chmod(const char __user * filename, mode_t mode)
+ {
+ 	struct nameidata nd;
+-	struct inode * inode;
+ 	int error;
+-	struct iattr newattrs;
+ 
+ 	error = user_path_walk(filename, &nd);
+ 	if (error)
+ 		goto out;
+-	inode = nd.dentry->d_inode;
+-
+-	error = -EROFS;
+-	if (IS_RDONLY(inode))
+-		goto dput_and_out;
+-
+-	error = -EPERM;
+-	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+-		goto dput_and_out;
+-
+-	down(&inode->i_sem);
+-	if (mode == (mode_t) -1)
+-		mode = inode->i_mode;
+-	newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
+-	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
+-	error = notify_change(nd.dentry, &newattrs);
+-	up(&inode->i_sem);
+ 
+-dput_and_out:
++	error = chmod_common(nd.dentry, mode);
+ 	path_release(&nd);
+ out:
+ 	return error;
+@@ -676,6 +701,18 @@
+ 	if (IS_RDONLY(inode))
+ 		goto out;
+ 	error = -EPERM;
++	if (inode->i_op->setattr_raw) {
++		struct inode_operations *op = dentry->d_inode->i_op;
++
++		newattrs.ia_uid = user;
++		newattrs.ia_gid = group;
++		newattrs.ia_valid = ATTR_UID | ATTR_GID;
++		newattrs.ia_valid |= ATTR_RAW;
++		error = op->setattr_raw(inode, &newattrs);
++		/* the file system wants to use normal vfs path now */
++		if (error != -EOPNOTSUPP)
++			return error;
++	}
+ 	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+ 		goto out;
+ 	newattrs.ia_valid =  ATTR_CTIME;
+@@ -689,6 +726,7 @@
+ 	}
+ 	if (!S_ISDIR(inode->i_mode))
+ 		newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
++
+ 	down(&inode->i_sem);
+ 	error = notify_change(dentry, &newattrs);
+ 	up(&inode->i_sem);
+Index: linux-2.6.4-51.0/fs/exec.c
+===================================================================
+--- linux-2.6.4-51.0.orig/fs/exec.c	2004-04-05 17:36:42.000000000 -0400
++++ linux-2.6.4-51.0/fs/exec.c	2004-04-05 17:36:43.000000000 -0400
+@@ -1418,7 +1418,7 @@
+ 		goto close_fail;
+ 	if (!file->f_op->write)
+ 		goto close_fail;
+-	if (do_truncate(file->f_dentry, 0) != 0)
++	if (do_truncate(file->f_dentry, 0, 0) != 0)
+ 		goto close_fail;
+ 
+ 	retval = binfmt->core_dump(signr, regs, file);
+Index: linux-2.6.4-51.0/include/linux/fs.h
+===================================================================
+--- linux-2.6.4-51.0.orig/include/linux/fs.h	2004-04-05 17:36:43.000000000 -0400
++++ linux-2.6.4-51.0/include/linux/fs.h	2004-04-05 17:36:43.000000000 -0400
+@@ -866,13 +866,20 @@
+ 	int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
+ 	struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
+ 	int (*link) (struct dentry *,struct inode *,struct dentry *);
++	int (*link_raw) (struct nameidata *,struct nameidata *);
+ 	int (*unlink) (struct inode *,struct dentry *);
++	int (*unlink_raw) (struct nameidata *);
+ 	int (*symlink) (struct inode *,struct dentry *,const char *);
++	int (*symlink_raw) (struct nameidata *,const char *);
+ 	int (*mkdir) (struct inode *,struct dentry *,int);
++	int (*mkdir_raw) (struct nameidata *,int);
+ 	int (*rmdir) (struct inode *,struct dentry *);
++	int (*rmdir_raw) (struct nameidata *);
+ 	int (*mknod) (struct inode *,struct dentry *,int,dev_t);
++	int (*mknod_raw) (struct nameidata *,int,dev_t);
+ 	int (*rename) (struct inode *, struct dentry *,
+ 			struct inode *, struct dentry *);
++	int (*rename_raw) (struct nameidata *, struct nameidata *);
+ 	int (*readlink) (struct dentry *, char __user *,int);
+ 	int (*follow_link) (struct dentry *, struct nameidata *);
+ 	void (*truncate) (struct inode *);
+@@ -1169,7 +1176,7 @@
+ 
+ /* fs/open.c */
+ 
+-extern int do_truncate(struct dentry *, loff_t start);
++extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
+ extern struct file *filp_open(const char *, int, int);
+ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
+ extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
+Index: linux-2.6.4-51.0/net/unix/af_unix.c
+===================================================================
+--- linux-2.6.4-51.0.orig/net/unix/af_unix.c	2004-04-05 12:42:07.000000000 -0400
++++ linux-2.6.4-51.0/net/unix/af_unix.c	2004-04-05 17:36:43.000000000 -0400
+@@ -676,6 +676,7 @@
+ 	int err = 0;
+ 	
+ 	if (sunname->sun_path[0]) {
++		intent_init(&nd.intent, IT_LOOKUP);
+ 		err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);
+ 		if (err)
+ 			goto fail;
diff --git a/lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch b/lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch
new file mode 100644
index 0000000000..ccca64d0e2
--- /dev/null
+++ b/lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch
@@ -0,0 +1,65 @@
+Index: linux-2.6.7-vanilla/fs/dcache.c
+===================================================================
+--- linux-2.6.7-vanilla.orig/fs/dcache.c	2004-07-01 12:09:19.000000000 +0300
++++ linux-2.6.7-vanilla/fs/dcache.c	2004-07-01 12:29:12.510193264 +0300
+@@ -219,7 +219,14 @@
+ 		spin_unlock(&dcache_lock);
+ 		return 0;
+ 	}
+-	/*
++
++        /* network invalidation by Lustre */
++	if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
++		spin_unlock(&dcache_lock);
++		return 0;
++	}
++
++        /*
+ 	 * Check whether to do a partial shrink_dcache
+ 	 * to get rid of unused child entries.
+ 	 */
+@@ -1114,19 +1121,28 @@
+  * Adds a dentry to the hash according to its name.
+  */
+  
+-void d_rehash(struct dentry * entry)
++void __d_rehash(struct dentry * entry, int lock)
+ {
+ 	struct hlist_head *list = d_hash(entry->d_parent, entry->d_name.hash);
+ 
+-	spin_lock(&dcache_lock);
++	if (lock)
++		spin_lock(&dcache_lock);
+ 	spin_lock(&entry->d_lock);
+  	entry->d_flags &= ~DCACHE_UNHASHED;
+ 	spin_unlock(&entry->d_lock);
+ 	entry->d_bucket = list;
+  	hlist_add_head_rcu(&entry->d_hash, list);
+-	spin_unlock(&dcache_lock);
++	if (lock)
++		spin_unlock(&dcache_lock);
+ }
+ 
++EXPORT_SYMBOL(__d_rehash);
++
++void d_rehash(struct dentry * entry)
++{
++	__d_rehash(entry, 1);
++ }
++
+ #define do_switch(x,y) do { \
+ 	__typeof__ (x) __tmp = x; \
+ 	x = y; y = __tmp; } while (0)
+Index: linux-2.6.7-vanilla/include/linux/dcache.h
+===================================================================
+--- linux-2.6.7-vanilla.orig/include/linux/dcache.h	2004-07-01 12:24:53.602553208 +0300
++++ linux-2.6.7-vanilla/include/linux/dcache.h	2004-07-01 12:27:29.757814000 +0300
+@@ -159,6 +159,8 @@
+ 
+ #define DCACHE_REFERENCED	0x0008  /* Recently used, don't discard. */
+ #define DCACHE_UNHASHED		0x0010	
++#define DCACHE_LUSTRE_INVALID     0x0020  /* Lustre invalidated */
++
+ 
+ extern spinlock_t dcache_lock;
+ 
diff --git a/lustre/kernel_patches/patches/vmalloc_to_page-2.4.19-pre1.patch b/lustre/kernel_patches/patches/vmalloc_to_page-2.4.19-pre1.patch
deleted file mode 100644
index 82a7d3e16c..0000000000
--- a/lustre/kernel_patches/patches/vmalloc_to_page-2.4.19-pre1.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-Index: linux-2.4.19-pre1/mm/memory.c
-===================================================================
---- linux-2.4.19-pre1.orig/mm/memory.c	2004-01-14 01:11:29.000000000 +0300
-+++ linux-2.4.19-pre1/mm/memory.c	2004-01-14 01:54:44.000000000 +0300
-@@ -1470,3 +1470,25 @@
- 			len, write, 0, NULL, NULL);
- 	return ret == len ? 0 : -1;
- }
-+
-+struct page * vmalloc_to_page(void * vmalloc_addr)
-+{
-+	unsigned long addr = (unsigned long) vmalloc_addr;
-+	struct page *page = NULL;
-+	pmd_t *pmd;
-+	pte_t *ptep, pte;
-+	pgd_t *pgd;
-+	
-+	pgd = pgd_offset_k(addr);
-+	if (!pgd_none(*pgd)) {
-+		pmd = pmd_offset(pgd, addr);
-+		if (!pmd_none(*pmd)) {
-+			ptep = pte_offset(pmd, addr);
-+			pte = *ptep;
-+			if (pte_present(pte)) {
-+				page = pte_page(pte);
-+			}
-+		}
-+	}
-+	return page;
-+}
-Index: linux-2.4.19-pre1/kernel/ksyms.c
-===================================================================
---- linux-2.4.19-pre1.orig/kernel/ksyms.c	2004-01-14 01:22:28.000000000 +0300
-+++ linux-2.4.19-pre1/kernel/ksyms.c	2004-01-14 01:51:55.000000000 +0300
-@@ -112,6 +112,8 @@
- EXPORT_SYMBOL(kfree);
- EXPORT_SYMBOL(vfree);
- EXPORT_SYMBOL(__vmalloc);
-+extern struct page * vmalloc_to_page(void *addr);
-+EXPORT_SYMBOL(vmalloc_to_page);
- EXPORT_SYMBOL(mem_map);
- EXPORT_SYMBOL(remap_page_range);
- EXPORT_SYMBOL(max_mapnr);
diff --git a/lustre/kernel_patches/patches/xattr-0.8.54-2.4.22-rh.patch b/lustre/kernel_patches/patches/xattr-0.8.54-2.4.22-rh.patch
deleted file mode 100644
index b2210456c9..0000000000
--- a/lustre/kernel_patches/patches/xattr-0.8.54-2.4.22-rh.patch
+++ /dev/null
@@ -1,5396 +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 |   90 +++
- arch/sparc/defconfig          |    7 
- arch/sparc64/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              |   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               |   37 +
- 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     |   13 
- include/asm-s390x/unistd.h    |   13 
- 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 +
- 58 files changed, 4306 insertions(+), 137 deletions(-)
-
---- linux-2.4.22-ac1/arch/alpha/defconfig~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/alpha/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/alpha/kernel/entry.S~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/alpha/kernel/entry.S	2003-09-25 23:57:02.000000000 +0400
-@@ -1158,6 +1158,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.22-ac1/arch/arm/defconfig~xattr-0.8.54-2.4.22-rh	2001-05-20 04:43:05.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/arm/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/arm/kernel/calls.S~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:39.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/arm/kernel/calls.S	2003-09-26 00:00:10.000000000 +0400
-@@ -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) /* 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 */
---- linux-2.4.22-ac1/arch/i386/defconfig~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/i386/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/ia64/defconfig~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:39.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/ia64/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/m68k/defconfig~xattr-0.8.54-2.4.22-rh	2000-06-19 23:56:08.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/m68k/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/mips64/defconfig~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:40.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/mips64/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/mips/defconfig~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:39.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/mips/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/ppc64/kernel/misc.S~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:40.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/ppc64/kernel/misc.S	2003-09-25 23:57:02.000000000 +0400
-@@ -805,6 +805,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
-@@ -817,6 +818,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.22-ac1/arch/ppc/defconfig~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:31.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/ppc/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/s390/defconfig~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/s390/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/s390/kernel/entry.S~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/s390/kernel/entry.S	2003-09-25 23:57:02.000000000 +0400
-@@ -559,18 +559,18 @@ sys_call_table:
-         .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
---- linux-2.4.22-ac1/arch/s390x/defconfig~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/s390x/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/s390x/kernel/entry.S~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/s390x/kernel/entry.S	2003-09-25 23:57:02.000000000 +0400
-@@ -591,18 +591,18 @@ sys_call_table:
- 	.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
---- linux-2.4.22-ac1/arch/s390x/kernel/wrapper32.S~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:40.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/s390x/kernel/wrapper32.S	2003-09-26 00:05:14.000000000 +0400
-@@ -1097,6 +1097,96 @@ 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
- 
- 	.globl	sys32_stime_wrapper
- sys32_stime_wrapper:
---- linux-2.4.22-ac1/arch/sparc64/defconfig~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:40.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/sparc64/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/arch/sparc/defconfig~xattr-0.8.54-2.4.22-rh	2002-08-03 04:39:43.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/arch/sparc/defconfig	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/Documentation/Configure.help~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:30.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/Documentation/Configure.help	2003-09-25 23:57:02.000000000 +0400
-@@ -16145,6 +16145,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
-@@ -16177,6 +16210,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.22-ac1/fs/Config.in~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:23.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/Config.in	2003-09-25 23:57:02.000000000 +0400
-@@ -29,6 +29,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
-@@ -88,6 +93,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
---- linux-2.4.22-ac1/fs/ext2/file.c~xattr-0.8.54-2.4.22-rh	2001-10-11 19:05:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/file.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext2/ialloc.c~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:37.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/ialloc.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext2/inode.c~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:37.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/inode.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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;
- 
-@@ -903,8 +915,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",
-@@ -989,10 +1000,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;
-@@ -1001,15 +1009,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;
- 	ext2_set_inode_flags(inode);
---- linux-2.4.22-ac1/fs/ext2/Makefile~xattr-0.8.54-2.4.22-rh	2001-10-11 19:05:18.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/Makefile	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext2/namei.c~xattr-0.8.54-2.4.22-rh	2001-10-04 09:57:36.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/namei.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext2/super.c~xattr-0.8.54-2.4.22-rh	2002-11-29 02:53:15.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext2/super.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext2/symlink.c~xattr-0.8.54-2.4.22-rh	2000-09-28 00:41:33.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext2/symlink.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext2/xattr.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext2/xattr_user.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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);
-+}
---- /dev/null	2003-01-30 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext3/ext3-exports.c	2003-09-25 23:57:02.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);
---- linux-2.4.22-ac1/fs/ext3/file.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:55:12.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/file.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 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.22-ac1/fs/ext3/ialloc.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/ialloc.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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>
-@@ -217,6 +218,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.22-ac1/fs/ext3/inode.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:29.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/inode.c	2003-09-26 00:10:09.000000000 +0400
-@@ -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(
-@@ -2163,10 +2173,7 @@ 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);
- 
--	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;
-@@ -2174,15 +2181,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]));
-+	}
- 	brelse(iloc.bh);
- 	ext3_set_inode_flags(inode);
- 	return;
---- linux-2.4.22-ac1/fs/ext3/Makefile~xattr-0.8.54-2.4.22-rh	2003-09-25 14:55:12.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/Makefile	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/ext3/namei.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:58:37.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/namei.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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>
-@@ -1614,7 +1615,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;
-@@ -1622,7 +1623,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? */
-@@ -1649,9 +1649,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) {
-@@ -2020,7 +2017,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 */
-+};
-+
---- linux-2.4.22-ac1/fs/ext3/super.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:55:12.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/ext3/super.c	2003-09-26 00:12:23.000000000 +0400
-@@ -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);
-@@ -506,6 +508,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;
-@@ -518,6 +521,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")) {
-@@ -935,6 +945,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;
-@@ -1839,22 +1855,35 @@ static DECLARE_FSTYPE_DEV(ext3_fs_type, 
- 
- 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");
---- linux-2.4.22-ac1/fs/ext3/symlink.c~xattr-0.8.54-2.4.22-rh	2001-11-10 01:25:04.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext3/symlink.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext3/xattr.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/ext3/xattr_user.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/jfs/jfs_xattr.h~xattr-0.8.54-2.4.22-rh	2002-11-29 02:53:15.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/jfs/jfs_xattr.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/fs/jfs/xattr.c~xattr-0.8.54-2.4.22-rh	2002-11-29 02:53:15.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/jfs/xattr.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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 */
---- linux-2.4.22-ac1/fs/Makefile~xattr-0.8.54-2.4.22-rh	2003-09-25 14:50:00.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/fs/Makefile	2003-09-25 23:57:02.000000000 +0400
-@@ -82,6 +82,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))
- 
---- /dev/null	2003-01-30 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/fs/mbcache.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/include/asm-arm/unistd.h~xattr-0.8.54-2.4.22-rh	2003-08-25 15:44:43.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/asm-arm/unistd.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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)
---- linux-2.4.22-ac1/include/asm-ppc64/unistd.h~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:38.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/asm-ppc64/unistd.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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
---- linux-2.4.22-ac1/include/asm-s390/unistd.h~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:38.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/asm-s390/unistd.h	2003-09-26 00:14:23.000000000 +0400
-@@ -213,6 +213,19 @@
- #define __NR_getdents64		220
- #define __NR_fcntl64		221
- #define __NR_readahead		222
-+#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
-+
- /*
-  * Numbers 224-235 are reserved for posix acl
-  */
---- linux-2.4.22-ac1/include/asm-s390x/unistd.h~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:38.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/asm-s390x/unistd.h	2003-09-26 00:15:11.000000000 +0400
-@@ -181,6 +181,19 @@
- #define __NR_mincore            218
- #define __NR_madvise            219
- #define __NR_readahead		222
-+#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
-+
- /*
-  * Numbers 224-235 are reserved for posix acl
-  */
---- /dev/null	2003-01-30 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/cache_def.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/include/linux/errno.h~xattr-0.8.54-2.4.22-rh	2001-02-10 01:46:13.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/errno.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/include/linux/ext2_fs.h~xattr-0.8.54-2.4.22-rh	2003-06-13 18:51:38.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/ext2_fs.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/ext2_xattr.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/include/linux/ext3_fs.h~xattr-0.8.54-2.4.22-rh	2003-09-25 14:58:30.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/ext3_fs.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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
-@@ -346,6 +321,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
-@@ -523,7 +499,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| \
-@@ -707,6 +683,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 *);
- 
-@@ -776,8 +753,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.22-ac1/include/linux/ext3_jbd.h~xattr-0.8.54-2.4.22-rh	2003-09-25 14:55:12.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/ext3_jbd.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/ext3_xattr.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/include/linux/fs.h~xattr-0.8.54-2.4.22-rh	2003-09-25 14:45:32.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/include/linux/fs.h	2003-09-25 23:57:02.000000000 +0400
-@@ -918,7 +918,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 13:24:37.000000000 +0300
-+++ linux-2.4.22-ac1-alexey/include/linux/mbcache.h	2003-09-25 23:57:02.000000000 +0400
-@@ -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.22-ac1/kernel/ksyms.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:42:46.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/kernel/ksyms.c	2003-09-26 00:19:05.000000000 +0400
-@@ -11,6 +11,7 @@
- 
- #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(exit_files);
- EXPORT_SYMBOL(exit_fs);
- EXPORT_SYMBOL(exit_sighand);
- EXPORT_SYMBOL(unshare_files);
-+EXPORT_SYMBOL(copy_fs_struct);
- 
- /* internal kernel memory management */
- EXPORT_SYMBOL(_alloc_pages);
-@@ -124,6 +126,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.22-ac1/mm/vmscan.c~xattr-0.8.54-2.4.22-rh	2003-09-25 14:16:28.000000000 +0400
-+++ linux-2.4.22-ac1-alexey/mm/vmscan.c	2003-09-25 23:57:02.000000000 +0400
-@@ -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
-
-_
diff --git a/lustre/kernel_patches/series/2.6-vanilla.series b/lustre/kernel_patches/series/2.6-vanilla.series
new file mode 100644
index 0000000000..6a9d4cfd32
--- /dev/null
+++ b/lustre/kernel_patches/series/2.6-vanilla.series
@@ -0,0 +1,18 @@
+uml-2.6.7-01-bb2.patch
+lustre_version.patch
+vfs_intent-2.6-vanilla.patch 
+vfs_nointent-2.6-vanilla.patch
+vfs_races-2.6-vanilla.patch
+vfs-wantedi-misc-2.6-suse.patch 
+nfs-cifs-intent-2.6-vanilla.patch 
+iopen-misc-2.6-suse.patch 
+export-truncate-2.6-suse.patch 
+export_symbols-2.6-suse.patch 
+dev_read_only-2.6-suse.patch 
+export-2.6-suse.patch
+header-guards-2.6-suse.patch
+ext3-super-ntohl.patch
+lookup_bdev_init_intent.patch
+dcache-mds-num-2.6.7.patch
+dynamic-locks-2.6.7.patch
+vfs-pdirops-2.6.7.patch
diff --git a/lustre/kernel_patches/series/bproc-2.4.20-hp-pnnl b/lustre/kernel_patches/series/bproc-2.4.20-hp-pnnl
deleted file mode 100644
index 41437b8952..0000000000
--- a/lustre/kernel_patches/series/bproc-2.4.20-hp-pnnl
+++ /dev/null
@@ -1,37 +0,0 @@
-dev_read_only_hp_2.4.20.patch
-exports_2.4.20-rh-hp.patch
-kmem_cache_validate_hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-hp.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports_hp.patch
-ext-2.4-patch-1.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54-hp.patch
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-use-after-free.patch
-ext3-orphan_lock.patch
-ext3-delete_thread-2.4.20.patch
-ext3-noread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy.patch
-socket-exports-vanilla.patch
-add_page_private.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20-hp.patch
-ext3-ea-in-inode-2.4.20.patch
-bproc-patch-2.4.20
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/chaos-2.4.21 b/lustre/kernel_patches/series/chaos-2.4.21
deleted file mode 100644
index 00039126c2..0000000000
--- a/lustre/kernel_patches/series/chaos-2.4.21
+++ /dev/null
@@ -1,35 +0,0 @@
-dev_read_only_2.4.21-chaos.patch 
-exports_2.4.19-suse.patch
-lustre_version.patch
-vfs_intent-2.4.21-chaos.patch 
-invalidate_show-2.4.20-rh.patch
-iod-rmap-exports-2.4.21-chaos.patch 
-export-truncate.patch
-ext3-htree-2.4.21-chaos.patch 
-linux-2.4.21-xattr-0.8.54-chaos.patch 
-ext3-ino_sb_macro-2.4.21-chaos.patch
-ext3-orphan_lock-2.4.22-rh.patch
-ext3-delete_thread-2.4.21-chaos.patch 
-extN-misc-fixup.patch
-ext3-noread-2.4.21-chaos.patch 
-extN-wantedi-2.4.21-chaos.patch 
-ext3-san-2.4.20.patch 
-extN-2.4.18-ino_sb_fixup.patch
-ext3-map_inode_page_2.4.18.patch
-ext3-error-export.patch
-iopen-2.4.21-chaos.patch 
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-o_direct-2.4.21-chaos.patch 
-ext3-no-write-super-chaos.patch
-add_page_private.patch 
-ext3-raw-lookup.patch
-nfs_export_kernel-2.4.21-chaos.patch 
-ext3-ea-in-inode-2.4.21-chaos.patch 
-listman-2.4.21-chaos.patch 
-gfp_memalloc-2.4.21-chaos.patch 
-ext3-xattr-ptr-arith-fix.patch
-kernel_text_address-2.4.18-chaos.patch
-pagecache-lock-2.4.21-chaos.patch 
-ext3-truncate-buffer-head.patch
-inode-max-readahead-2.4.24.patch
diff --git a/lustre/kernel_patches/series/hp-pnnl-2.4.20 b/lustre/kernel_patches/series/hp-pnnl-2.4.20
deleted file mode 100644
index cb9c74c671..0000000000
--- a/lustre/kernel_patches/series/hp-pnnl-2.4.20
+++ /dev/null
@@ -1,46 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-dev_read_only_hp_2.4.20.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-hp.patch 
-invalidate_show-2.4.20-hp.patch 
-export-truncate.patch
-iod-stock-24-exports_hp.patch
-ext-2.4-patch-1.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54-hp.patch
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-use-after-free.patch
-ext3-orphan_lock.patch
-ext3-delete_thread-2.4.20-hp.patch 
-ext3-noread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-add_page_private.patch
-socket-exports-vanilla.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20-hp.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-gfp_memalloc-2.4.22.patch
-ext3-xattr-ptr-arith-fix.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
-inode-max-readahead-2.4.24.patch
-dcache_refcount_debug.patch
diff --git a/lustre/kernel_patches/series/ldiskfs-2.6.6-vanilla.series b/lustre/kernel_patches/series/ldiskfs-2.6-vanilla.series
similarity index 56%
rename from lustre/kernel_patches/series/ldiskfs-2.6.6-vanilla.series
rename to lustre/kernel_patches/series/ldiskfs-2.6-vanilla.series
index 3c72833b01..3b561e42b6 100644
--- a/lustre/kernel_patches/series/ldiskfs-2.6.6-vanilla.series
+++ b/lustre/kernel_patches/series/ldiskfs-2.6-vanilla.series
@@ -1,3 +1,4 @@
+ext3-pdirops-2.6.7.patch
 ext3-wantedi-2.6-suse.patch
 ext3-san-jdike-2.6-suse.patch
 iopen-2.6-vanilla.patch 
@@ -7,3 +8,9 @@ ext3-init-generation-2.6-suse.patch
 ext3-ea-in-inode-2.6-suse.patch
 export-ext3-2.6-suse.patch
 ext3-include-fixes-2.6-suse.patch
+ext3-extents-2.6.7.patch
+ext3-extents-in-ea-2.6.7.patch
+ext3-extents-in-ea-ioctl-2.6.7.patch
+ext3-extents-in-ea-exports-symbol-2.6.7.patch
+ext3-mds-num-2.6.7.patch
+ext3-inode-reuse-2.6.7.patch
diff --git a/lustre/kernel_patches/series/rh-2.4.20 b/lustre/kernel_patches/series/rh-2.4.20
deleted file mode 100644
index 0ad83a92e8..0000000000
--- a/lustre/kernel_patches/series/rh-2.4.20
+++ /dev/null
@@ -1,48 +0,0 @@
-configurable-x86-stack-2.4.20-rh.patch
-mcore-2.4.20-8.patch
-dsp.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-rh.patch 
-invalidate_show-2.4.20-rh.patch
-iod-rmap-exports-2.4.20.patch
-export-truncate.patch
-ext-2.4-patch-1-chaos.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54-chaos.patch
-ext3-2.4.20-fixes.patch
-ext3_orphan_lock-2.4.20-rh.patch
-ext3_delete_thread_2.4.20_chaos.patch 
-ext3-noread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-o_direct-1.2.4.20-rh.patch 
-ext3-no-write-super-chaos.patch
-dynamic-locks-2.4.20-rh.patch 
-vfs-pdirops-2.4.20-rh.patch 
-ext3-pdirops-2.4.20-chaos.patch 
-tcp_zero_copy_2.4.20_chaos.patch
-gpl_header-chaos-2.4.20.patch
-add_page_private.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20-rh.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-netconsole-2.4.20-rh.patch
-kernel_text_address-2.4.20-rh.patch
-gfp_memalloc-2.4.20-rh.patch
-ext3-xattr-ptr-arith-fix.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
-inode-max-readahead-2.4.24.patch
-mkdep-revert-rh-2.4.patch
diff --git a/lustre/kernel_patches/series/rh-2.4.22 b/lustre/kernel_patches/series/rh-2.4.22
deleted file mode 100644
index 2d8c431121..0000000000
--- a/lustre/kernel_patches/series/rh-2.4.22
+++ /dev/null
@@ -1,32 +0,0 @@
-configurable-x86-stack-2.4.22-rh.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.22-rh.patch
-invalidate_show-2.4.20-rh.patch
-export-truncate.patch
-iod-stock-exports-2.4.22-rh.patch
-ext3-htree-2.4.22-rh.patch
-xattr-0.8.54-2.4.22-rh.patch
-ext3-orphan_lock-2.4.22-rh.patch
-ext3-noread-2.4.20.patch
-ext3_delete_thread_2.4.20_chaos.patch
-extN-wantedi-2.4.22-rh.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.22-rh.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-add_page_private.patch
-socket-exports-2.4.22-rh.patch
-nfs_export_kernel-2.4.22-rh.patch
-ext3-ea-in-inode-2.4.22-rh.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-gfp_memalloc-2.4.22.patch
-ext3-xattr-ptr-arith-fix.patch
-procfs-ndynamic-2.4.patch
-kernel_text_address-2.4.18-chaos.patch
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/smfs-2.4.20 b/lustre/kernel_patches/series/smfs-2.4.20
deleted file mode 100644
index 2cdff78723..0000000000
--- a/lustre/kernel_patches/series/smfs-2.4.20
+++ /dev/null
@@ -1,58 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-uml-patch-2.4.20-6.patch
-uml-2.4.20-do_mmap_pgoff-fix.patch
-uml-2.4.20-fixes-1.patch
-uml_get_kmem_end_export.patch
-dev_read_only_2.4.20.patch
-exports_2.4.20.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports.patch
-uml_check_get_page.patch
-uml_no_panic.patch
-ext-2.4-patch-1.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54.patch
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-unmount_sync.patch
-ext3-use-after-free.patch
-ext3-orphan_lock.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-2.4.20.patch 
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super.patch
-add_page_private.patch
-socket-exports-vanilla.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-ext3-extents-2.4.20.patch 
-ext3-extents-in-ea-2.4.20.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
-ext3-extents-in-ea-exports-symbol.patch
-kernel_text_address-2.4.20-vanilla.patch 
-ext3-xattr-ptr-arith-fix.patch
-gfp_memalloc-2.4.22.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
-smfs-export-symbol.patch
diff --git a/lustre/kernel_patches/series/smfs-2.4.20-rh b/lustre/kernel_patches/series/smfs-2.4.20-rh
deleted file mode 100644
index 987ad86afc..0000000000
--- a/lustre/kernel_patches/series/smfs-2.4.20-rh
+++ /dev/null
@@ -1,50 +0,0 @@
-configurable-x86-stack-2.4.20-rh.patch
-mcore-2.4.20-8.patch
-dsp.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-rh.patch
-invalidate_show-2.4.20-rh.patch
-iod-rmap-exports-2.4.20.patch
-export-truncate.patch
-ext-2.4-patch-1-chaos.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54-chaos.patch
-ext3-2.4.20-fixes.patch
-ext3_orphan_lock-2.4.20-rh.patch
-ext3_delete_thread_2.4.20_chaos.patch 
-ext3-noread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-o_direct-1.2.4.20-rh.patch 
-ext3-no-write-super-chaos.patch
-dynamic-locks-2.4.20-rh.patch 
-vfs-pdirops-2.4.20-rh.patch 
-ext3-pdirops-2.4.18-chaos.patch
-tcp_zero_copy_2.4.20_chaos.patch
-add_page_private.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20-rh.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-ext3-extents-2.4.20-rh.patch 
-ext3-extents-in-ea-2.4.20.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
-ext3-extents-in-ea-exports-symbol.patch 
-netconsole-2.4.20-rh.patch
-kernel_text_address-2.4.20-rh.patch
-gfp_memalloc-2.4.20-rh.patch
-ext3-xattr-ptr-arith-fix.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
-smfs-export-symbol.patch
diff --git a/lustre/kernel_patches/series/smfs-2.4.24 b/lustre/kernel_patches/series/smfs-2.4.24
deleted file mode 100644
index 4a24f6cc5c..0000000000
--- a/lustre/kernel_patches/series/smfs-2.4.24
+++ /dev/null
@@ -1,46 +0,0 @@
-uml-patch-2.4.24-1.patch
-uml-2.4.20-do_mmap_pgoff-fix.patch
-uml-export-end_iomem.patch 
-configurable-x86-stack-2.4.20.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch 
-invalidate_show.patch
-export-truncate.patch
-iod-stock-exports-2.4.22.patch 
-ext3-htree-2.4.22-rh.patch
-linux-2.4.24-xattr-0.8.54.patch 
-ext3-orphan_lock-2.4.22-rh.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-2.4.24.patch 
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.22-rh.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-nfs_export_kernel-2.4.22.patch 
-ext3-ea-in-inode-2.4.22-rh.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-ext3-extents-2.4.20.patch
-ext3-extents-in-ea-2.4.20.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
-ext3-extents-in-ea-exports-symbol.patch
-kernel_text_address-2.4.22-vanilla.patch
-gfp_memalloc-2.4.24.patch
-ext3-xattr-ptr-arith-fix.patch
-3.5G-address-space-2.4.22-vanilla.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
-inode-max-readahead-2.4.24.patch
-dynamic-locks-2.4.24.patch 
-vfs-pdirops-2.4.20-rh.patch
-ext3-pdirops-2.4.24-chaos.patch 
-ext3-mds-num-2.4.24.patch 
-export_lookup_create.patch
diff --git a/lustre/kernel_patches/series/snapfs-2.4.20 b/lustre/kernel_patches/series/snapfs-2.4.20
deleted file mode 100644
index ce46da4e5a..0000000000
--- a/lustre/kernel_patches/series/snapfs-2.4.20
+++ /dev/null
@@ -1,57 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-uml-patch-2.4.20-6.patch
-uml-2.4.20-do_mmap_pgoff-fix.patch
-uml-2.4.20-fixes-1.patch
-uml_get_kmem_end_export.patch
-dev_read_only_2.4.20.patch
-exports_2.4.20.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports.patch
-uml_check_get_page.patch
-uml_no_panic.patch
-ext-2.4-patch-1.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54.patch
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-unmount_sync.patch
-ext3-use-after-free.patch
-ext3-orphan_lock.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super.patch
-add_page_private.patch
-socket-exports-vanilla.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-ext3-extents-2.4.20.patch 
-ext3-extents-in-ea-2.4.20.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
-ext3-record-extents-ea.patch 
-kernel_text_address-2.4.20-vanilla.patch 
-ext3-xattr-ptr-arith-fix.patch
-gfp_memalloc-2.4.22.patch
-loop_device_get_info.patch 
-ext3-snapfs-2.4.20.patch 
diff --git a/lustre/kernel_patches/series/suse-2.4.19 b/lustre/kernel_patches/series/suse-2.4.19
deleted file mode 100644
index 12eab3d992..0000000000
--- a/lustre/kernel_patches/series/suse-2.4.19
+++ /dev/null
@@ -1,35 +0,0 @@
-dev_read_only-suse-2.4.19.patch
-exports_2.4.19-suse.patch 
-lustre_version.patch
-vfs_intent-2.4.19-suse.patch 
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports-2.4.19-suse.patch 
-jbd-2.4.18-jcberr.patch
-ext-2.4-patch-1-suse-2.4.19.patch 
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.19-xattr-0.8.54-suse.patch 
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-use-after-free-suse.patch 
-ext3-orphan_lock-2.4.19-suse.patch 
-ext3-delete_thread-2.4.19-suse.patch 
-ext3-noread-2.4.20.patch
-extN-wantedi-2.4.19-suse.patch 
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.19-suse.patch 
-tcp-zero-copy.patch
-add_page_private.patch
-removepage-2.4.19-suse.patch 
-jbd-ctx_switch.patch
-jbd-flushtime-2.4.19-suse.patch 
-jbd-get_write_access.patch
-ext3-ea-in-inode-2.4.20.patch 
-listman-2.4.20.patch
-ext3-trusted_ea-suse-2.4.19.patch
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/suse-2.4.21 b/lustre/kernel_patches/series/suse-2.4.21
deleted file mode 100644
index 481ed7db04..0000000000
--- a/lustre/kernel_patches/series/suse-2.4.21
+++ /dev/null
@@ -1,33 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports.patch
-ext3-htree-suse.patch
-linux-2.4.21-xattr-0.8.54-suse.patch
-ext3-orphan_lock-suse.patch 
-ext3-noread-2.4.20.patch
-ext3-delete_thread-suse.patch 
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.22-rh.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-socket-exports-vanilla.patch
-nfs_export_kernel-2.4.20.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-gfp_memalloc-2.4.22.patch
-ext3-xattr-ptr-arith-fix.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/suse-2.4.21-2 b/lustre/kernel_patches/series/suse-2.4.21-2
deleted file mode 100644
index 6272220368..0000000000
--- a/lustre/kernel_patches/series/suse-2.4.21-2
+++ /dev/null
@@ -1,45 +0,0 @@
-configurable-x86-stack-2.4.21-suse2.patch
-configurable-x86_64-2.4.21.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.21-suse2.patch 
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports_hp.patch
-ext3-htree-2.4.21-chaos.patch
-linux-2.4.21-xattr-0.8.54-suse2.patch
-ext3-orphan_lock-2.4.22-rh.patch 
-ext3-noread-2.4.21-suse2.patch
-ext3-delete_thread-2.4.21-chaos.patch 
-extN-wantedi-2.4.21-suse2.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page-2.4.21-suse2.patch 
-ext3-error-export.patch
-iopen-2.4.21-sles8sp3.patch
-tcp-zero-copy-2.4.21-suse2.patch 
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-nfs_export_kernel-2.4.21-suse2.patch
-ext3-ea-in-inode-2.4.21-suse2.patch
-listman-2.4.20.patch
-gfp_memalloc-2.4.24.patch 
-ext3-xattr-ptr-arith-fix.patch
-kernel_text_address-2.4.20-vanilla.patch 
-procfs-ndynamic-2.4.21-suse2.patch 
-ext3-truncate-buffer-head.patch
-qlogic-suse-2.4.21-2.patch
-loop-sync-2.4.21-suse.patch
-ext3-extents-2.4.21-suse2.patch 
-ext3-extents-asyncdel-2.4.24.patch
-dynamic-locks-2.4.21-suse2.patch
-vfs-pdirops-2.4.21-suse2.patch 
-ext3-pdirops-2.4.24-chaos.patch
-ext3-mds-num-2.4.21-suse.patch 
-ext3-inode-reuse-2.4.20.patch
-ext3-raw-lookup-pdirops.patch
-ext3-extents-in-ea-2.4.21-suse2.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
-ext3-extents-in-ea-exports-symbol-2.4.21-suse2.patch 
diff --git a/lustre/kernel_patches/series/suse-sles8sp3-2.4.21 b/lustre/kernel_patches/series/suse-sles8sp3-2.4.21
deleted file mode 100644
index 5bc8822723..0000000000
--- a/lustre/kernel_patches/series/suse-sles8sp3-2.4.21
+++ /dev/null
@@ -1,31 +0,0 @@
-configurable-x86-stack-2.4.21-sles8sp3.patch 
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.21-sles8sp3.patch 
-invalidate_show-2.4.21-sles8sp3.patch 
-iod-stock-24-exports_hp.patch
-ext3-htree-2.4.21-chaos.patch
-linux-2.4.21-xattr-0.8.54-suse2.patch
-ext3-orphan_lock-2.4.22-rh.patch 
-ext3-noread-2.4.21-suse2.patch
-ext3-delete_thread-2.4.21-chaos.patch 
-extN-wantedi-2.4.21-suse2.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page-2.4.21-suse2.patch 
-ext3-error-export.patch
-iopen-2.4.21-sles8sp3.patch 
-tcp-zero-copy-2.4.21-sles8sp3.patch 
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-nfs_export_kernel-2.4.21-suse2.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.21-suse2.patch
-listman-2.4.20.patch
-gfp_memalloc-2.4.24.patch 
-ext3-xattr-ptr-arith-fix.patch
-kernel_text_address-2.4.21-sles8sp3.patch 
-ext3-truncate-buffer-head.patch
-export-truncate.patch
diff --git a/lustre/kernel_patches/series/vanilla-2.4.19-pre1 b/lustre/kernel_patches/series/vanilla-2.4.19-pre1
deleted file mode 100644
index 19c697415c..0000000000
--- a/lustre/kernel_patches/series/vanilla-2.4.19-pre1
+++ /dev/null
@@ -1,48 +0,0 @@
-configurable-x86-stack-2.4.19-pre1.patch
-dev_read_only_2.4.20.patch
-exports_2.4.19-pre1.patch 
-lustre_version.patch
-vfs_intent-2.4.19-pre1.patch 
-invalidate_show-2.4.19-pre1.patch 
-export-truncate.patch
-iod-stock-24-exports.patch
-ext3-htree-2.4.19-pre1.patch 
-linux-2.4.19-pre1-xattr-0.8.54.patch 
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-unmount_sync.patch
-ext3-use-after-free-2.4.19-pre1.patch 
-ext3-orphan_lock.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-2.4.20.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.19-pre1.patch 
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super.patch
-add_page_private-2.4.19-pre1.patch 
-socket-exports-vanilla.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime-2.4.19-suse.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.19-pre1.patch 
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-kernel_text_address-2.4.19-pre1.patch
-jbd-2.4.19-pre1-jcberr.patch 
-seq-private-2.4.19-pre1.patch 
-kdev-2.4.19-pre1.patch 
-resched-2.4.19-pre1.patch
-ext3-xattr-ptr-arith-fix.patch
-gfp_memalloc-2.4.22.patch
-vmalloc_to_page-2.4.19-pre1.patch 
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/vanilla-2.4.20 b/lustre/kernel_patches/series/vanilla-2.4.20
deleted file mode 100644
index cdbce78184..0000000000
--- a/lustre/kernel_patches/series/vanilla-2.4.20
+++ /dev/null
@@ -1,58 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-uml-patch-2.4.20-6.patch
-uml-2.4.20-do_mmap_pgoff-fix.patch
-uml-2.4.20-fixes-1.patch
-uml_get_kmem_end_export.patch
-dev_read_only_2.4.20.patch
-exports_2.4.20.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-24-exports.patch
-uml_check_get_page.patch
-uml_no_panic.patch
-ext-2.4-patch-1.patch
-ext-2.4-patch-2.patch
-ext-2.4-patch-3.patch
-ext-2.4-patch-4.patch
-linux-2.4.20-xattr-0.8.54.patch
-ext3-2.4.20-fixes.patch
-ext3-2.4-ino_t.patch
-ext3-largefile.patch
-ext3-truncate_blocks.patch
-ext3-unmount_sync.patch
-ext3-use-after-free.patch
-ext3-orphan_lock.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-2.4.20.patch 
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super.patch
-add_page_private.patch
-socket-exports-vanilla.patch
-removepage-2.4.20.patch
-jbd-ctx_switch.patch
-jbd-flushtime.patch
-jbd-get_write_access.patch
-nfs_export_kernel-2.4.20.patch
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.20.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-kernel_text_address-2.4.20-vanilla.patch 
-ext3-xattr-ptr-arith-fix.patch
-gfp_memalloc-2.4.22.patch
-procfs-ndynamic-2.4.patch
-linux-2.4.20-filemap.patch
-ext3-truncate-buffer-head.patch
-dynamic-locks-2.4.20-rh.patch 
-vfs-pdirops-2.4.20.patch
-ext3-pdirops-2.4.20.patch 
-ext3-mds-num-2.4.24.patch 
diff --git a/lustre/kernel_patches/series/vanilla-2.4.22 b/lustre/kernel_patches/series/vanilla-2.4.22
deleted file mode 100644
index 3d5bb6d826..0000000000
--- a/lustre/kernel_patches/series/vanilla-2.4.22
+++ /dev/null
@@ -1,35 +0,0 @@
-configurable-x86-stack-2.4.20.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
-lustre_version.patch
-vfs_intent-2.4.20-vanilla.patch
-invalidate_show.patch
-export-truncate.patch
-iod-stock-exports-2.4.22.patch 
-ext3-htree-2.4.22-rh.patch
-linux-2.4.22-xattr-0.8.54.patch 
-ext3-orphan_lock-2.4.22-rh.patch
-ext3-noread-2.4.20.patch
-ext3-delete_thread-suse.patch
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.22-rh.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-socket-exports-2.4.22-rh.patch
-nfs_export_kernel-2.4.22.patch 
-ext3-raw-lookup.patch
-ext3-ea-in-inode-2.4.22-rh.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
-kernel_text_address-2.4.22-vanilla.patch
-gfp_memalloc-2.4.22.patch
-ext3-xattr-ptr-arith-fix.patch
-3.5G-address-space-2.4.22-vanilla.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
diff --git a/lustre/kernel_patches/series/vanilla-2.4.24 b/lustre/kernel_patches/series/vanilla-2.4.24
index 7db12db7c4..fd99cca508 100644
--- a/lustre/kernel_patches/series/vanilla-2.4.24
+++ b/lustre/kernel_patches/series/vanilla-2.4.24
@@ -1,49 +1,52 @@
 uml-patch-2.4.24-1.patch
-uml-2.4.20-do_mmap_pgoff-fix.patch
-uml-export-end_iomem.patch 
-configurable-x86-stack-2.4.20.patch
-dev_read_only_2.4.20-rh.patch
-exports_2.4.20-rh-hp.patch
+uml-2.4.24-do_mmap_pgoff-fix.patch
+uml-export-end_iomem-2.4.24.patch 
+configurable-x86-stack-2.4.24.patch
+dev_read_only-2.4.24.patch
+exports-2.4.24.patch
 lustre_version.patch 
-vfs_intent-2.4.20-vanilla.patch 
-invalidate_show.patch
-export-truncate.patch
-iod-stock-exports-2.4.22.patch 
-ext3-htree-2.4.22-rh.patch
+vfs_intent-2.4.24.patch 
+invalidate_show-2.4.24.patch
+export-truncate-2.4.24.patch
+iod-stock-exports-2.4.24.patch 
+ext3-htree-2.4.24.patch
 linux-2.4.24-xattr-0.8.54.patch 
-ext3-orphan_lock-2.4.22-rh.patch
-ext3-noread-2.4.20.patch
+ext3-orphan_lock-2.4.24.patch
+ext3-noread-2.4.24.patch
 ext3-delete_thread-2.4.24.patch 
-extN-wantedi.patch
-ext3-san-2.4.20.patch
-ext3-map_inode_page.patch
-ext3-error-export.patch
-iopen-2.4.20.patch
-tcp-zero-copy-2.4.22-rh.patch
-jbd-dont-account-blocks-twice.patch
-jbd-commit-tricks.patch
-ext3-no-write-super-chaos.patch
-add_page_private.patch
-nfs_export_kernel-2.4.22.patch 
-ext3-ea-in-inode-2.4.22-rh.patch
-listman-2.4.20.patch
-ext3-trusted_ea-2.4.20.patch
+extN-wantedi-2.4.24.patch
+ext3-san-2.4.24.patch
+ext3-map_inode_page-2.4.24.patch
+ext3-error-export-2.4.24.patch
+iopen-2.4.24.patch
+tcp-zero-copy-2.4.24.patch
+jbd-dont-account-blocks-twice-2.4.24.patch
+jbd-commit-tricks-2.4.24.patch
+ext3-no-write-super-2.4.24.patch
+add_page_private-2.4.24.patch
+nfs_export_kernel-2.4.24.patch 
+ext3-ea-in-inode-2.4.24.patch
+listman-2.4.24.patch
+ext3-trusted_ea-2.4.24.patch
 ext3-extents-2.4.24.patch 
-ext3-extents-in-ea-2.4.20.patch
-ext3-extents-in-ea-ioctl-2.4.20.patch
+ext3-extents-in-ea-2.4.24.patch
+ext3-extents-in-ea-ioctl-2.4.24.patch
 ext3-extents-in-ea-exports-symbol-2.4.24.patch
 kernel_text_address-2.4.24-vanilla.patch
 gfp_memalloc-2.4.24.patch
-ext3-xattr-ptr-arith-fix.patch
-3.5G-address-space-2.4.22-vanilla.patch
-procfs-ndynamic-2.4.patch
-ext3-truncate-buffer-head.patch
+ext3-xattr-ptr-arith-fix-2.4.24.patch
+3.5G-address-space-2.4.24-vanilla.patch
+procfs-ndynamic-2.4.24.patch
+ext3-truncate-buffer-head-2.4.24.patch
 inode-max-readahead-2.4.24.patch
 dynamic-locks-2.4.24.patch
-vfs-pdirops-2.4.20-rh.patch
+vfs-pdirops-2.4.24.patch
 ext3-pdirops-2.4.24-chaos.patch
-ext3-mds-num-2.4.24.patch 
-export_lookup_create.patch
-ext3-raw-lookup-pdirops.patch
-kksymoops-2.4.24.vanilla.patch
-ext3-inode-reuse-2.4.20.patch
+ext3-mds-num-2.4.24.patch
+export_lookup_create-2.4.24.patch
+ext3-raw-lookup-pdirops-2.4.24.patch
+kksymoops-2.4.24.vanilla.patch 
+ext3-inode-reuse-2.4.24.patch
+export-zap-page-range-2.4.24.patch
+export_num_siblings-2.4.24.patch
+ext3-nlinks-2.4.24.patch
diff --git a/lustre/kernel_patches/series/vanilla-2.6.6 b/lustre/kernel_patches/series/vanilla-2.6.6
deleted file mode 100644
index 96eb50f0b6..0000000000
--- a/lustre/kernel_patches/series/vanilla-2.6.6
+++ /dev/null
@@ -1,13 +0,0 @@
-lustre_version.patch
-vfs_intent-2.6-suse.patch 
-vfs_nointent-2.6-suse.patch 
-vfs_races-2.6-suse.patch
-ext3-wantedi-misc-2.6-suse.patch 
-nfs-cifs-intent-2.6-suse.patch
-iopen-misc-2.6-suse.patch 
-export-truncate-2.6-suse.patch 
-export_symbols-2.6-suse.patch 
-removepage-vanilla-2.6.5.patch
-dev_read_only-2.6-suse.patch 
-export-2.6-suse.patch
-header-guards-2.6-suse.patch
diff --git a/lustre/ldiskfs/Makefile.in b/lustre/ldiskfs/Makefile.in
index 7d1e229e95..80d9efb84d 100644
--- a/lustre/ldiskfs/Makefile.in
+++ b/lustre/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/lustre/ldiskfs/autoMakefile.am b/lustre/ldiskfs/autoMakefile.am
index 11838d68af..e33e4c941a 100644
--- a/lustre/ldiskfs/autoMakefile.am
+++ b/lustre/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/lustre/ldlm/l_lock.c b/lustre/ldlm/l_lock.c
index 024ec26756..9940df188a 100644
--- a/lustre/ldlm/l_lock.c
+++ b/lustre/ldlm/l_lock.c
@@ -85,9 +85,9 @@ void l_lock(struct lustre_lock *lock)
 
 void l_unlock(struct lustre_lock *lock)
 {
-        LASSERT(lock->l_owner == current);
-        LASSERT(lock->l_depth >= 0);
-
+        LASSERTF(lock->l_owner == current, "lock %p, current %p\n",
+                 lock->l_owner, current);
+        LASSERTF(lock->l_depth >= 0, "depth %d\n", lock->l_depth);
         spin_lock(&lock->l_spin);
         if (--lock->l_depth < 0) {
                 lock->l_owner = NULL;
diff --git a/lustre/ldlm/ldlm_extent.c b/lustre/ldlm/ldlm_extent.c
index ea93e13dca..5661d733c7 100644
--- a/lustre/ldlm/ldlm_extent.c
+++ b/lustre/ldlm/ldlm_extent.c
@@ -380,6 +380,7 @@ out:
 
 /* When a lock is cancelled by a client, the KMS may undergo change if this
  * is the "highest lock".  This function returns the new KMS value.
+ * Caller must hold ns_lock already. 
  *
  * NB: A lock on [x,y] protects a KMS of up to y + 1 bytes! */
 __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms)
@@ -390,11 +391,10 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms)
         __u64 kms = 0;
         ENTRY;
 
-        l_lock(&res->lr_namespace->ns_lock);
+        /* don't let another thread in ldlm_extent_shift_kms race in
+         * just after we finish and take our lock into account in its
+         * calculation of the kms */
 
-        /* don't let another thread in ldlm_extent_shift_kms race in just after
-         * we finish and take our lock into account in its calculation of the
-         * kms */
         lock->l_flags |= LDLM_FL_KMS_IGNORE;
 
         list_for_each(tmp, &res->lr_granted) {
@@ -404,7 +404,7 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms)
                         continue;
 
                 if (lck->l_policy_data.l_extent.end >= old_kms)
-                        GOTO(out, kms = old_kms);
+                        RETURN(old_kms);
 
                 /* This extent _has_ to be smaller than old_kms (checked above)
                  * so kms can only ever be smaller or the same as old_kms. */
@@ -413,8 +413,5 @@ __u64 ldlm_extent_shift_kms(struct ldlm_lock *lock, __u64 old_kms)
         }
         LASSERTF(kms <= old_kms, "kms "LPU64" old_kms "LPU64"\n", kms, old_kms);
 
-        GOTO(out, kms);
- out:
-        l_unlock(&res->lr_namespace->ns_lock);
-        return kms;
+        RETURN(kms);
 }
diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c
index 8d41587132..d0e24663f1 100644
--- a/lustre/ldlm/ldlm_lib.c
+++ b/lustre/ldlm/ldlm_lib.c
@@ -35,10 +35,142 @@
 #include <linux/lustre_mgmt.h>
 #include <linux/lustre_dlm.h>
 #include <linux/lustre_net.h>
+/* @priority: if non-zero, move the selected to the list head
+ * @nocreate: if non-zero, only search in existed connections
+ */
+static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid,
+                           int priority, int nocreate)
+{
+        struct ptlrpc_connection *ptlrpc_conn;
+        struct obd_import_conn *imp_conn = NULL, *item;
+        int rc = 0;
+        ENTRY;
+
+        LASSERT(!(nocreate && !priority));
+
+        ptlrpc_conn = ptlrpc_uuid_to_connection(uuid);
+        if (!ptlrpc_conn) {
+                CERROR("can't find connection %s\n", uuid->uuid);
+                RETURN (-EINVAL);
+        }
+
+        if (!nocreate) {
+                OBD_ALLOC(imp_conn, sizeof(*imp_conn));
+                if (!imp_conn) {
+                        CERROR("fail to alloc memory\n");
+                        GOTO(out_put, rc = -ENOMEM);
+                }
+        }
+
+        spin_lock(&imp->imp_lock);
+        list_for_each_entry(item, &imp->imp_conn_list, oic_item) {
+                if (obd_uuid_equals(uuid, &item->oic_uuid)) {
+                        if (priority) {
+                                list_del(&item->oic_item);
+                                list_add(&item->oic_item, &imp->imp_conn_list);
+                                item->oic_last_attempt = 0;
+                        }
+                        CDEBUG(D_HA, "imp %p@%s: find existed conn %s%s\n",
+                               imp, imp->imp_obd->obd_name, uuid->uuid,
+                               (priority ? ", move to head." : ""));
+                        spin_unlock(&imp->imp_lock);
+                        GOTO(out_free, rc = 0);
+                }
+        }
+        /* not found */
+        if (!nocreate) {
+                imp_conn->oic_conn = ptlrpc_conn;
+                imp_conn->oic_uuid = *uuid;
+                imp_conn->oic_last_attempt = 0;
+                if (priority)
+                        list_add(&imp_conn->oic_item, &imp->imp_conn_list);
+                else
+                        list_add_tail(&imp_conn->oic_item, &imp->imp_conn_list);
+                CDEBUG(D_HA, "imp %p@%s: add connection %s at %s\n",
+                       imp, imp->imp_obd->obd_name, uuid->uuid,
+                       (priority ? "head" : "tail"));
+        } else
+                rc = -ENOENT;
+
+        spin_unlock(&imp->imp_lock);
+        RETURN(0);
+out_free:
+        if (imp_conn)
+                OBD_FREE(imp_conn, sizeof(*imp_conn));
+out_put:
+        ptlrpc_put_connection(ptlrpc_conn);
+        RETURN(rc);
+}
+
+int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid)
+{
+        return import_set_conn(imp, uuid, 1, 1);
+}
+
+int client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid,
+                           int priority)
+{
+        return import_set_conn(imp, uuid, priority, 0);
+}
+
+int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid)
+{
+        struct obd_import_conn *imp_conn;
+        struct obd_export *dlmexp;
+        int rc = -ENOENT;
+        ENTRY;
+
+        spin_lock(&imp->imp_lock);
+        if (list_empty(&imp->imp_conn_list)) {
+                LASSERT(!imp->imp_conn_current);
+                LASSERT(!imp->imp_connection);
+                GOTO(out, rc);
+        }
+
+        list_for_each_entry(imp_conn, &imp->imp_conn_list, oic_item) {
+                if (!obd_uuid_equals(uuid, &imp_conn->oic_uuid))
+                        continue;
+                LASSERT(imp_conn->oic_conn);
+
+                /* is current conn? */
+                if (imp_conn == imp->imp_conn_current) {
+                        LASSERT(imp_conn->oic_conn == imp->imp_connection);
+
+                        if (imp->imp_state != LUSTRE_IMP_CLOSED &&
+                            imp->imp_state != LUSTRE_IMP_DISCON) {
+                                CERROR("can't remove current connection\n");
+                                GOTO(out, rc = -EBUSY);
+                        }
+
+                        ptlrpc_put_connection(imp->imp_connection);
+                        imp->imp_connection = NULL;
+
+                        dlmexp = class_conn2export(&imp->imp_dlm_handle);
+                        if (dlmexp && dlmexp->exp_connection) {
+                                LASSERT(dlmexp->exp_connection ==
+                                        imp_conn->oic_conn);
+                                ptlrpc_put_connection(dlmexp->exp_connection);
+                                dlmexp->exp_connection = NULL;
+                        }
+                }
+
+                list_del(&imp_conn->oic_item);
+                ptlrpc_put_connection(imp_conn->oic_conn);
+                OBD_FREE(imp_conn, sizeof(*imp_conn));
+                CDEBUG(D_HA, "imp %p@%s: remove connection %s\n",
+                       imp, imp->imp_obd->obd_name, uuid->uuid);
+                rc = 0;
+                break;
+        }
+out:
+        spin_unlock(&imp->imp_lock);
+        if (rc == -ENOENT)
+                CERROR("connection %s not found\n", uuid->uuid);
+        RETURN(rc);
+}
 
 int client_obd_setup(struct obd_device *obddev, obd_count len, void *buf)
 {
-        struct ptlrpc_connection *conn;
         struct lustre_cfg* lcfg = buf;
         struct client_obd *cli = &obddev->u.cli;
         struct obd_import *imp;
@@ -98,19 +230,30 @@ int client_obd_setup(struct obd_device *obddev, obd_count len, void *buf)
 
         cli->cl_dirty = 0;
         cli->cl_avail_grant = 0;
+        /* FIXME: should limit this for the sum of all cl_dirty_max */
         cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024;
+        if (cli->cl_dirty_max >> PAGE_SHIFT > num_physpages / 8)
+                cli->cl_dirty_max = num_physpages << (PAGE_SHIFT - 3);
         INIT_LIST_HEAD(&cli->cl_cache_waiters);
         INIT_LIST_HEAD(&cli->cl_loi_ready_list);
         INIT_LIST_HEAD(&cli->cl_loi_write_list);
         INIT_LIST_HEAD(&cli->cl_loi_read_list);
         spin_lock_init(&cli->cl_loi_list_lock);
-        cli->cl_brw_in_flight = 0;
+        cli->cl_r_in_flight = 0;
+        cli->cl_w_in_flight = 0;
         spin_lock_init(&cli->cl_read_rpc_hist.oh_lock);
         spin_lock_init(&cli->cl_write_rpc_hist.oh_lock);
         spin_lock_init(&cli->cl_read_page_hist.oh_lock);
         spin_lock_init(&cli->cl_write_page_hist.oh_lock);
-        cli->cl_max_pages_per_rpc = PTLRPC_MAX_BRW_PAGES;
-        cli->cl_max_rpcs_in_flight = OSC_MAX_RIF_DEFAULT;
+        
+        if (num_physpages <= 32768) { /* <= 128 MB */
+                cli->cl_max_pages_per_rpc = PTLRPC_MAX_BRW_PAGES / 3;
+                cli->cl_max_rpcs_in_flight = OSC_MAX_RIF_DEFAULT / 3;
+        } else {
+                cli->cl_max_pages_per_rpc = PTLRPC_MAX_BRW_PAGES;
+                cli->cl_max_rpcs_in_flight = OSC_MAX_RIF_DEFAULT;
+        }
+
 
         rc = ldlm_get_ref();
         if (rc) {
@@ -118,19 +261,12 @@ int client_obd_setup(struct obd_device *obddev, obd_count len, void *buf)
                 GOTO(err, rc);
         }
 
-        conn = ptlrpc_uuid_to_connection(&server_uuid);
-        if (conn == NULL)
-                GOTO(err_ldlm, rc = -ENOENT);
-
         ptlrpc_init_client(rq_portal, rp_portal, name,
                            &obddev->obd_ldlm_client);
 
         imp = class_new_import();
-        if (imp == NULL) {
-                ptlrpc_put_connection(conn);
+        if (imp == NULL) 
                 GOTO(err_ldlm, rc = -ENOENT);
-        }
-        imp->imp_connection = conn;
         imp->imp_client = &obddev->obd_ldlm_client;
         imp->imp_obd = obddev;
         imp->imp_connect_op = connect_op;
@@ -141,6 +277,12 @@ int client_obd_setup(struct obd_device *obddev, obd_count len, void *buf)
               lcfg->lcfg_inllen1);
         class_import_put(imp);
 
+        rc = client_import_add_conn(imp, &server_uuid, 1);
+        if (rc) {
+                CERROR("can't add initial connection\n");
+                GOTO(err_import, rc);
+        }
+
         cli->cl_import = imp;
         cli->cl_max_mds_easize = sizeof(struct lov_mds_md);
         cli->cl_max_mds_cookiesize = sizeof(struct llog_cookie);
@@ -250,14 +392,13 @@ int client_connect_import(struct lustre_handle *dlm_handle,
         if (rc != 0) 
                 GOTO(out_ldlm, rc);
 
-        exp->exp_connection = ptlrpc_connection_addref(imp->imp_connection);
         imp->imp_connect_flags = connect_flags;
         rc = ptlrpc_connect_import(imp, NULL);
         if (rc != 0) {
                 LASSERT (imp->imp_state == LUSTRE_IMP_DISCON);
                 GOTO(out_ldlm, rc);
         }
-
+        LASSERT(exp->exp_connection);
         ptlrpc_pinger_add_import(imp);
         EXIT;
 
@@ -363,6 +504,7 @@ int target_handle_reconnect(struct lustre_handle *conn, struct obd_export *exp,
         RETURN(0);
 }
 
+static char nidstr[PTL_NALFMT_SIZE];
 int target_handle_connect(struct ptlrpc_request *req)
 {
         unsigned long connect_flags = 0, *cfp;
@@ -397,8 +539,8 @@ int target_handle_connect(struct ptlrpc_request *req)
         }
         
         if (!target || target->obd_stopping || !target->obd_set_up) {
-                CERROR("UUID '%s' is not available for connect\n", str);
-
+                CERROR("UUID '%s' is not available for connect from NID %s\n",
+                       str, ptlrpc_peernid2str(&req->rq_peer, nidstr));
                 GOTO(out, rc = -ENODEV);
         }
 
@@ -500,8 +642,9 @@ int target_handle_connect(struct ptlrpc_request *req)
 #endif
         if (export == NULL) {
                 if (target->obd_recovering) {
-                        CERROR("denying connection for new client %s@%s: "
-                               "%d clients in recovery for %lds\n", cluuid.uuid,
+                        CERROR("%s denying connection for new client %s@%s: "
+                               "%d clients in recovery for %lds\n", target->obd_name, 
+                               cluuid.uuid,
                                ptlrpc_peernid2str(&req->rq_peer, peer_str),
                                target->obd_recoverable_clients,
                                (target->obd_recovery_timer.expires-jiffies)/HZ);
@@ -658,21 +801,46 @@ void ptlrpc_free_clone( struct ptlrpc_request *req)
         OBD_FREE(req, sizeof *req);
 }
 
-static void abort_delayed_replies(struct obd_device *obd)
+
+
+static void target_release_saved_req(struct ptlrpc_request *req)
+{
+        class_export_put(req->rq_export);
+        OBD_FREE(req->rq_reqmsg, req->rq_reqlen);
+        OBD_FREE(req, sizeof *req);
+}
+
+static void target_finish_recovery(struct obd_device *obd)
 {
-        struct ptlrpc_request *req;
         struct list_head *tmp, *n;
+        int rc;
+
+        CWARN("%s: sending delayed replies to recovered clients\n",
+              obd->obd_name);
+
+        ldlm_reprocess_all_ns(obd->obd_namespace);
+
+        /* when recovery finished, cleanup orphans on mds and ost */
+        if (OBT(obd) && OBP(obd, postrecov)) {
+                rc = OBP(obd, postrecov)(obd);
+                if (rc >= 0)
+                        CWARN("%s: all clients recovered, %d MDS "
+                              "orphans deleted\n", obd->obd_name, rc);
+                else
+                        CERROR("postrecov failed %d\n", rc);
+        }
+
+
         list_for_each_safe(tmp, n, &obd->obd_delayed_reply_queue) {
+                struct ptlrpc_request *req;
                 req = list_entry(tmp, struct ptlrpc_request, rq_list);
-                DEBUG_REQ(D_ERROR, req, "aborted:");
-                req->rq_status = -ENOTCONN;
-                req->rq_type = PTL_RPC_MSG_ERR;
-                ptlrpc_reply(req);
-                class_export_put(req->rq_export);
                 list_del(&req->rq_list);
-                OBD_FREE(req->rq_reqmsg, req->rq_reqlen);
-                OBD_FREE(req, sizeof *req);
+                DEBUG_REQ(D_ERROR, req, "delayed:");
+                ptlrpc_reply(req);
+                target_release_saved_req(req);
         }
+        obd->obd_recovery_end = LTIME_S(CURRENT_TIME);
+        return;
 }
 
 static void abort_recovery_queue(struct obd_device *obd)
@@ -683,6 +851,7 @@ static void abort_recovery_queue(struct obd_device *obd)
 
         list_for_each_safe(tmp, n, &obd->obd_recovery_queue) {
                 req = list_entry(tmp, struct ptlrpc_request, rq_list);
+                list_del(&req->rq_list);
                 DEBUG_REQ(D_ERROR, req, "aborted:");
                 req->rq_status = -ENOTCONN;
                 req->rq_type = PTL_RPC_MSG_ERR;
@@ -693,35 +862,61 @@ static void abort_recovery_queue(struct obd_device *obd)
                         DEBUG_REQ(D_ERROR, req,
                                   "packing failed for abort-reply; skipping");
                 }
+                target_release_saved_req(req);
+        }
+}
+/* Called from a cleanup function if the device is being cleaned up
+   forcefully.  The exports should all have been disconnected already,
+   the only thing left to do is
+     - clear the recovery flags
+     - cancel the timer
+     - free queued requests and replies, but don't send replies
+   Because the obd_stopping flag is set, no new requests should be received.
+
+*/
+void target_cleanup_recovery(struct obd_device *obd)
+{
+        struct list_head *tmp, *n;
+        struct ptlrpc_request *req;
+
+        spin_lock_bh(&obd->obd_processing_task_lock);
+        if (!obd->obd_recovering) {
+                spin_unlock_bh(&obd->obd_processing_task_lock);
+                EXIT;
+                return;
+        }
+        obd->obd_recovering = obd->obd_abort_recovery = 0;
+        target_cancel_recovery_timer(obd);
+        spin_unlock_bh(&obd->obd_processing_task_lock);
+
+        list_for_each_safe(tmp, n, &obd->obd_delayed_reply_queue) {
+                req = list_entry(tmp, struct ptlrpc_request, rq_list);
                 list_del(&req->rq_list);
-                class_export_put(req->rq_export);
-                OBD_FREE(req->rq_reqmsg, req->rq_reqlen);
-                OBD_FREE(req, sizeof *req);
+                LASSERT (req->rq_reply_state);
+                lustre_free_reply_state(req->rq_reply_state);
+                target_release_saved_req(req);
         }
+        list_for_each_safe(tmp, n, &obd->obd_recovery_queue) {
+                req = list_entry(tmp, struct ptlrpc_request, rq_list);
+                list_del(&req->rq_list);
+                LASSERT (req->rq_reply_state == 0);
+                target_release_saved_req(req);
+         }
 }
 
 static void target_abort_recovery(void *data)
 {
         struct obd_device *obd = data;
-        int rc;
-
-        CERROR("disconnecting clients and aborting recovery\n");
+                                                                                                                                                                                                     
         LASSERT(!obd->obd_recovering);
 
-        class_disconnect_exports(obd, 0);
+        class_disconnect_stale_exports(obd, 0);
 
-        /* when recovery was aborted, cleanup orphans on mds and ost */
-        if (OBT(obd) && OBP(obd, postrecov)) {
-                rc = OBP(obd, postrecov)(obd);
-                if (rc >= 0)
-                        CWARN("Cleanup %d orphans after recovery was aborted\n",
-                              rc);
-                else
-                        CERROR("postrecov failed %d\n", rc);
-        }
+        CERROR("%s: recovery period over; disconnecting unfinished clients.\n",
+               obd->obd_name);
 
-        abort_delayed_replies(obd);
         abort_recovery_queue(obd);
+        target_finish_recovery(obd);
         ptlrpc_run_recovery_over_upcall(obd);
 }
 
@@ -730,7 +925,9 @@ static void target_recovery_expired(unsigned long castmeharder)
         struct obd_device *obd = (struct obd_device *)castmeharder;
         CERROR("recovery timed out, aborting\n");
         spin_lock_bh(&obd->obd_processing_task_lock);
-        obd->obd_abort_recovery = 1;
+        if (obd->obd_recovering)
+                obd->obd_abort_recovery = 1;
+
         wake_up(&obd->obd_next_transno_waitq);
         spin_unlock_bh(&obd->obd_processing_task_lock);
 }
@@ -773,37 +970,6 @@ void target_start_recovery_timer(struct obd_device *obd)
         spin_unlock_bh(&obd->obd_processing_task_lock);
 }
 
-static void target_finish_recovery(struct obd_device *obd)
-{
-        struct list_head *tmp, *n;
-        int rc2;
-
-        ldlm_reprocess_all_ns(obd->obd_namespace);
-
-        CWARN("%s: all clients recovered, calling postrecov\n",
-              obd->obd_name);
-        /* when recovery finished, cleanup orphans on mds and ost */
-        if (OBT(obd) && OBP(obd, postrecov)) {
-                rc2 = OBP(obd, postrecov)(obd);
-                if (rc2 >= 0)
-                        CWARN("%s: all clients recovered, %d MDS "
-                              "orphans deleted\n", obd->obd_name, rc2);
-                else
-                        CERROR("postrecov failed %d\n", rc2);
-        }
-
-        CWARN("%s: recovery over, sending delayed replies\n",
-              obd->obd_name);
-        list_for_each_safe(tmp, n, &obd->obd_delayed_reply_queue) {
-                struct ptlrpc_request *req;
-                req = list_entry(tmp, struct ptlrpc_request, rq_list);
-                DEBUG_REQ(D_ERROR, req, "delayed:");
-                ptlrpc_reply(req);
-                ptlrpc_free_clone(req);
-        }
-        ptlrpc_run_recovery_over_upcall(obd);
-}
-
 static int check_for_next_transno(struct obd_device *obd)
 {
         struct ptlrpc_request *req = NULL;
@@ -877,7 +1043,7 @@ target_next_replay_req(struct obd_device *obd)
         return req;
 }
 
-
+#ifdef __KERNEL__
 static int target_recovery_thread(void *arg)
 {
         struct obd_device *obd = arg;
@@ -971,7 +1137,7 @@ void target_stop_recovery_thread(struct obd_device *obd)
                 spin_unlock_bh(&obd->obd_processing_task_lock);
         }
 }
-
+#endif
 int target_queue_recovery_request(struct ptlrpc_request *req,
                                   struct obd_device *obd)
 {
@@ -1110,15 +1276,8 @@ target_send_reply_msg (struct ptlrpc_request *req, int rc, int fail_id)
         }
 
         if (rc) {
-                DEBUG_REQ(D_ERROR, req, "processing error (%d)", rc);
-                if (req->rq_reply_state == NULL) {
-                        rc = lustre_pack_reply (req, 0, NULL, NULL);
-                        if (rc != 0) {
-                                CERROR ("can't allocate reply\n");
-                                return (rc);
-                        }
-                }
-                req->rq_type = PTL_RPC_MSG_ERR;
+                req->rq_status = rc;
+                return (ptlrpc_error(req));
         } else {
                 DEBUG_REQ(D_NET, req, "sending reply");
         }
diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c
index d5607ffe6d..b42370800a 100644
--- a/lustre/ldlm/ldlm_lock.c
+++ b/lustre/ldlm/ldlm_lock.c
@@ -234,7 +234,7 @@ static void lock_handle_addref(void *lock)
  * usage: pass in a resource on which you have done ldlm_resource_get
  *        pass in a parent lock on which you have done a ldlm_lock_get
  *        after return, ldlm_*_put the resource and parent
- * returns: lock with refcount 1
+ * returns: lock with refcount 2 - one for current caller and one for remote
  */
 static struct ldlm_lock *ldlm_lock_new(struct ldlm_lock *parent,
                                        struct ldlm_resource *resource)
@@ -483,13 +483,9 @@ void ldlm_lock_decref_internal(struct ldlm_lock *lock, __u32 mode)
 
                 LDLM_LOCK_GET(lock); /* dropped by bl thread */
                 ldlm_lock_remove_from_lru(lock);
-#ifdef __KERNEL__
-                ldlm_bl_to_thread(ns, NULL, lock);
-                l_unlock(&ns->ns_lock);
-#else
                 l_unlock(&ns->ns_lock);
-                ldlm_handle_bl_callback(ns, NULL, lock);
-#endif
+                if (ldlm_bl_to_thread(ns, NULL, lock) != 0)
+                        ldlm_handle_bl_callback(ns, NULL, lock);
         } else if (ns->ns_client == LDLM_NAMESPACE_CLIENT &&
                    !lock->l_readers && !lock->l_writers) {
                 /* If this is a client-side namespace and this was the last
diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c
index 1a298b95e9..cdf0d9e770 100644
--- a/lustre/ldlm/ldlm_lockd.c
+++ b/lustre/ldlm/ldlm_lockd.c
@@ -44,12 +44,9 @@ extern kmem_cache_t *ldlm_resource_slab;
 extern kmem_cache_t *ldlm_lock_slab;
 extern struct lustre_lock ldlm_handle_lock;
 extern struct list_head ldlm_namespace_list;
-extern int (*mds_reint_p)(int offset, struct ptlrpc_request *req);
-extern int (*mds_getattr_name_p)(int offset, struct ptlrpc_request *req);
 
 static DECLARE_MUTEX(ldlm_ref_sem);
-static int ldlm_refcount = 0;
-
+static int ldlm_refcount;
 /* LDLM state */
 
 static struct ldlm_state *ldlm_state;
@@ -73,6 +70,10 @@ static struct expired_lock_thread {
 } expired_lock_thread;
 #endif
 
+#if !defined(ENOTSUPP)
+#  define ENOTSUPP 524
+#endif
+
 #define ELT_STOPPED   0
 #define ELT_READY     1
 #define ELT_TERMINATE 2
@@ -376,7 +377,8 @@ int ldlm_server_blocking_ast(struct ldlm_lock *lock,
                 /* this blocking AST will be communicated as part of the
                  * completion AST instead */
                 l_unlock(&lock->l_resource->lr_namespace->ns_lock);
-                LDLM_DEBUG(lock, "lock not granted, not sending blocking AST");                 RETURN(0);
+                LDLM_DEBUG(lock, "lock not granted, not sending blocking AST");                 
+                RETURN(0);
         }
 
         if (lock->l_destroyed) {
@@ -415,7 +417,7 @@ int ldlm_server_blocking_ast(struct ldlm_lock *lock,
         l_unlock(&lock->l_resource->lr_namespace->ns_lock);
 
         req->rq_send_state = LUSTRE_IMP_FULL;
-        req->rq_timeout = 2; /* 2 second timeout for initial AST reply */
+        req->rq_timeout = ldlm_timeout; /* timeout for initial AST reply */
         rc = ptlrpc_queue_wait(req);
         if (rc != 0)
                 rc = ldlm_handle_ast_error(lock, req, rc, "blocking");
@@ -449,11 +451,13 @@ int ldlm_server_completion_ast(struct ldlm_lock *lock, int flags, void *data)
         if (total_enqueue_wait / 1000000 > obd_timeout)
                 LDLM_ERROR(lock, "enqueue wait took %ldus", total_enqueue_wait);
 
+        down(&lock->l_resource->lr_lvb_sem);
         if (lock->l_resource->lr_lvb_len) {
                 buffers = 2;
                 size[1] = lock->l_resource->lr_lvb_len;
         }
-
+        up(&lock->l_resource->lr_lvb_sem);
+        
         req = ptlrpc_prep_req(lock->l_export->exp_imp_reverse,
                               LUSTRE_DLM_VERSION, LDLM_CP_CALLBACK,
                               buffers, size, NULL);
@@ -467,10 +471,15 @@ int ldlm_server_completion_ast(struct ldlm_lock *lock, int flags, void *data)
         ldlm_lock2desc(lock, &body->lock_desc);
 
         if (buffers == 2) {
-                void *lvb = lustre_msg_buf(req->rq_reqmsg, 1,
-                                           lock->l_resource->lr_lvb_len);
+                void *lvb;
+                
+                down(&lock->l_resource->lr_lvb_sem);
+                lvb = lustre_msg_buf(req->rq_reqmsg, 1,
+                                     lock->l_resource->lr_lvb_len);
+
                 memcpy(lvb, lock->l_resource->lr_lvb_data,
                        lock->l_resource->lr_lvb_len);
+                up(&lock->l_resource->lr_lvb_sem);
         }
 
         LDLM_DEBUG(lock, "server preparing completion AST (after %ldus wait)",
@@ -478,7 +487,7 @@ int ldlm_server_completion_ast(struct ldlm_lock *lock, int flags, void *data)
         req->rq_replen = lustre_msg_size(0, NULL);
 
         req->rq_send_state = LUSTRE_IMP_FULL;
-        req->rq_timeout = 2; /* 2 second timeout for initial AST reply */
+        req->rq_timeout = ldlm_timeout; /* timeout for initial AST reply */
 
         /* We only send real blocking ASTs after the lock is granted */
         l_lock(&lock->l_resource->lr_namespace->ns_lock);
@@ -579,8 +588,15 @@ int ldlm_handle_enqueue(struct ptlrpc_request *req,
         LDLM_DEBUG(lock, "server-side enqueue handler, new lock created");
 
         LASSERT(req->rq_export);
-        lock->l_export = class_export_get(req->rq_export);
+        OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_ENQUEUE_BLOCKED, obd_timeout * 2);
         l_lock(&lock->l_resource->lr_namespace->ns_lock);
+        if (req->rq_export->exp_failed) {
+                LDLM_ERROR(lock,"lock on destroyed export %p\n",req->rq_export);
+                l_unlock(&lock->l_resource->lr_namespace->ns_lock);
+                GOTO(out, err = -ENOTCONN);
+        }
+        lock->l_export = class_export_get(req->rq_export);
+
         list_add(&lock->l_export_chain,
                  &lock->l_export->exp_ldlm_data.led_held_locks);
         l_unlock(&lock->l_resource->lr_namespace->ns_lock);
@@ -591,11 +607,12 @@ int ldlm_handle_enqueue(struct ptlrpc_request *req,
                 cookie = req;
         } else {
                 int buffers = 1;
+                down(&lock->l_resource->lr_lvb_sem);
                 if (lock->l_resource->lr_lvb_len) {
                         size[1] = lock->l_resource->lr_lvb_len;
                         buffers = 2;
                 }
-
+                up(&lock->l_resource->lr_lvb_sem);
                 if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR))
                         GOTO(out, rc = -ENOMEM);
 
@@ -647,12 +664,22 @@ int ldlm_handle_enqueue(struct ptlrpc_request *req,
                 LDLM_DEBUG(lock, "server-side enqueue handler, sending reply"
                            "(err=%d, rc=%d)", err, rc);
 
-                if (lock->l_resource->lr_lvb_len > 0 && rc == 0) {
-                        void *lvb = lustre_msg_buf(req->rq_repmsg, 1,
-                                                  lock->l_resource->lr_lvb_len);
-                        LASSERT(lvb != NULL);
-                        memcpy(lvb, lock->l_resource->lr_lvb_data,
-                               lock->l_resource->lr_lvb_len);
+                if (rc == 0) {
+                        down(&lock->l_resource->lr_lvb_sem);
+                        size[1] = lock->l_resource->lr_lvb_len;
+                        if (size[1] > 0) {
+                                void *lvb = lustre_msg_buf(req->rq_repmsg,
+                                                           1, size[1]);
+                                LASSERTF(lvb != NULL, "req %p, lock %p\n",
+                                         req, lock);
+
+                                memcpy(lvb, lock->l_resource->lr_lvb_data,
+                                       size[1]);
+                        }
+                        up(&lock->l_resource->lr_lvb_sem);
+                } else {
+                        ldlm_lock_destroy(lock);
+
                 }
 
                 if (!err && dlm_req->lock_desc.l_resource.lr_type != LDLM_FLOCK)
@@ -893,21 +920,16 @@ static void ldlm_handle_gl_callback(struct ptlrpc_request *req,
                 ptlrpc_error(req);
         }
 
+        l_unlock(&ns->ns_lock);
         if (lock->l_granted_mode == LCK_PW &&
             !lock->l_readers && !lock->l_writers &&
             time_after(jiffies, lock->l_last_used + 10 * HZ)) {
-#ifdef __KERNEL__
-                ldlm_bl_to_thread(ns, NULL, lock);
-                l_unlock(&ns->ns_lock);
-#else
-                l_unlock(&ns->ns_lock);
-                ldlm_handle_bl_callback(ns, NULL, lock);
-#endif
+                if (ldlm_bl_to_thread(ns, NULL, lock))
+                        ldlm_handle_bl_callback(ns, NULL, lock);
+
                 EXIT;
                 return;
         }
-
-        l_unlock(&ns->ns_lock);
         LDLM_LOCK_PUT(lock);
         EXIT;
 }
@@ -944,11 +966,12 @@ int ldlm_bl_to_thread(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld,
         list_add_tail(&blwi->blwi_entry, &blp->blp_list);
         wake_up(&blp->blp_waitq);
         spin_unlock(&blp->blp_lock);
+
+        RETURN(0);
 #else
-        LBUG();
+        RETURN(-ENOSYS);
 #endif
 
-        RETURN(0);
 }
 
 static int ldlm_msg_check_version(struct lustre_msg *msg)
@@ -1012,13 +1035,11 @@ static int ldlm_callback_handler(struct ptlrpc_request *req)
                 struct ldlm_request *dlm_req;
 
                 CDEBUG(D_RPCTRACE, "operation %d from nid %s with bad "
-                       "export cookie "LPX64" (ptl req %d/rep %d); this is "
+                       "export cookie "LPX64"; this is "
                        "normal if this node rebooted with a lock held\n",
                        req->rq_reqmsg->opc,
                        ptlrpc_peernid2str(&req->rq_peer, str),
-                       req->rq_reqmsg->handle.cookie,
-                       req->rq_request_portal, req->rq_reply_portal);
-
+                       req->rq_reqmsg->handle.cookie);
                 dlm_req = lustre_swab_reqbuf(req, 0, sizeof (*dlm_req),
                                              lustre_swab_ldlm_request);
                 if (dlm_req != NULL)
@@ -1112,14 +1133,10 @@ static int ldlm_callback_handler(struct ptlrpc_request *req)
         switch (req->rq_reqmsg->opc) {
         case LDLM_BL_CALLBACK:
                 CDEBUG(D_INODE, "blocking ast\n");
-#ifdef __KERNEL__
-                rc = ldlm_bl_to_thread(ns, &dlm_req->lock_desc, lock);
-                ldlm_callback_reply(req, rc);
-#else
-                rc = 0;
-                ldlm_callback_reply(req, rc);
-                ldlm_handle_bl_callback(ns, &dlm_req->lock_desc, lock);
-#endif
+                ldlm_callback_reply(req, 0);
+                if (ldlm_bl_to_thread(ns, &dlm_req->lock_desc, lock))
+                        ldlm_handle_bl_callback(ns, &dlm_req->lock_desc, lock);
+
                 break;
         case LDLM_CP_CALLBACK:
                 CDEBUG(D_INODE, "completion ast\n");
@@ -1155,9 +1172,11 @@ static int ldlm_cancel_handler(struct ptlrpc_request *req)
 
         if (req->rq_export == NULL) {
                 struct ldlm_request *dlm_req;
-                CERROR("operation %d with bad export (ptl req %d/rep %d)\n",
-                       req->rq_reqmsg->opc, req->rq_request_portal,
-                       req->rq_reply_portal);
+                char str[PTL_NALFMT_SIZE];
+                CERROR("operation %d with bad export from NID %s\n",
+                       req->rq_reqmsg->opc,
+                       ptlrpc_peernid2str(&req->rq_peer, str));
+
                 CERROR("--> export cookie: "LPX64"\n",
                        req->rq_reqmsg->handle.cookie);
                 dlm_req = lustre_swab_reqbuf(req, 0, sizeof (*dlm_req),
@@ -1442,7 +1461,9 @@ static int ldlm_cleanup(int force)
         wake_up(&expired_lock_thread.elt_waitq);
         wait_event(expired_lock_thread.elt_waitq,
                    expired_lock_thread.elt_state == ELT_STOPPED);
-
+#else
+        ptlrpc_unregister_service(ldlm_state->ldlm_cb_service);
+        ptlrpc_unregister_service(ldlm_state->ldlm_cancel_service);
 #endif
 
         OBD_FREE(ldlm_state, sizeof(*ldlm_state));
@@ -1476,10 +1497,11 @@ void __exit ldlm_exit(void)
 {
         if ( ldlm_refcount )
                 CERROR("ldlm_refcount is %d in ldlm_exit!\n", ldlm_refcount);
-        if (kmem_cache_destroy(ldlm_resource_slab) != 0)
-                CERROR("couldn't free ldlm resource slab\n");
-        if (kmem_cache_destroy(ldlm_lock_slab) != 0)
-                CERROR("couldn't free ldlm lock slab\n");
+        LASSERTF(kmem_cache_destroy(ldlm_resource_slab) == 0,
+                 "couldn't free ldlm resource slab\n");
+        LASSERTF(kmem_cache_destroy(ldlm_lock_slab) == 0,
+                 "couldn't free ldlm lock slab\n");
+
 }
 
 /* ldlm_flock.c */
@@ -1557,6 +1579,8 @@ EXPORT_SYMBOL(l_lock);
 EXPORT_SYMBOL(l_unlock);
 
 /* ldlm_lib.c */
+EXPORT_SYMBOL(client_import_add_conn);
+EXPORT_SYMBOL(client_import_del_conn);
 EXPORT_SYMBOL(client_obd_setup);
 EXPORT_SYMBOL(client_obd_cleanup);
 EXPORT_SYMBOL(client_connect_import);
@@ -1564,6 +1588,7 @@ EXPORT_SYMBOL(client_disconnect_export);
 EXPORT_SYMBOL(target_start_recovery_thread);
 EXPORT_SYMBOL(target_stop_recovery_thread);
 EXPORT_SYMBOL(target_handle_connect);
+EXPORT_SYMBOL(target_cleanup_recovery);
 EXPORT_SYMBOL(target_destroy_export);
 EXPORT_SYMBOL(target_cancel_recovery_timer);
 EXPORT_SYMBOL(target_send_reply);
diff --git a/lustre/ldlm/ldlm_request.c b/lustre/ldlm/ldlm_request.c
index 635ec4d7df..14e0610a27 100644
--- a/lustre/ldlm/ldlm_request.c
+++ b/lustre/ldlm/ldlm_request.c
@@ -405,8 +405,10 @@ int ldlm_cli_enqueue(struct obd_export *exp,
         if (lvb_len && (lock->l_req_mode != lock->l_granted_mode)) {
                 void *tmplvb;
                 tmplvb = lustre_swab_repbuf(req, 1, lvb_len, lvb_swabber);
-                if (tmplvb == NULL)
+                if (tmplvb == NULL) {
+                        cleanup_phase = 2;
                         GOTO(cleanup, rc = -EPROTO);
+                }
                 memcpy(lock->l_lvb_data, tmplvb, lvb_len);
         }
 
@@ -414,8 +416,10 @@ int ldlm_cli_enqueue(struct obd_export *exp,
                 rc = ldlm_lock_enqueue(ns, &lock, NULL, flags);
                 if (lock->l_completion_ast != NULL) {
                         int err = lock->l_completion_ast(lock, *flags, NULL);
-                        if (!rc)
+                        if (!rc) {
+                                cleanup_phase = 2;
                                 rc = err;
+                        }
                 }
         }
 
@@ -626,6 +630,10 @@ int ldlm_cancel_lru(struct ldlm_namespace *ns, ldlm_sync_t sync)
         LIST_HEAD(cblist);
         ENTRY;
 
+#ifndef __KERNEL__
+        sync = LDLM_SYNC; /* force to be sync in user space */
+#endif
+
         l_lock(&ns->ns_lock);
         count = ns->ns_nr_unused - ns->ns_max_unused;
 
@@ -649,9 +657,7 @@ int ldlm_cancel_lru(struct ldlm_namespace *ns, ldlm_sync_t sync)
 
                 LDLM_LOCK_GET(lock); /* dropped by bl thread */
                 ldlm_lock_remove_from_lru(lock);
-                if (sync == LDLM_ASYNC)
-                        ldlm_bl_to_thread(ns, NULL, lock);
-                else
+                if (sync != LDLM_ASYNC || ldlm_bl_to_thread(ns, NULL, lock))                        
                         list_add(&lock->l_lru, &cblist);
 
                 if (--count == 0)
@@ -948,7 +954,10 @@ static int replay_lock_interpret(struct ptlrpc_request *req,
                sizeof(lock->l_remote_handle));
         LDLM_DEBUG(lock, "replayed lock:");
         ptlrpc_import_recovery_state_machine(req->rq_import);
- out:
+out:
+        if (rc != ELDLM_OK)
+                ptlrpc_connect_import(req->rq_import, NULL);
+
         RETURN(rc);
 }
 
diff --git a/lustre/ldlm/ldlm_resource.c b/lustre/ldlm/ldlm_resource.c
index 0aefd7936c..910fcf1489 100644
--- a/lustre/ldlm/ldlm_resource.c
+++ b/lustre/ldlm/ldlm_resource.c
@@ -136,7 +136,7 @@ static int lprocfs_write_lru_size(struct file *file, const char *buffer,
                                   unsigned long count, void *data)
 {
         struct ldlm_namespace *ns = data;
-        char dummy[MAX_STRING_SIZE + 1];
+        char dummy[MAX_STRING_SIZE + 1], *end;
         unsigned long tmp;
 
         dummy[MAX_STRING_SIZE] = '\0';
@@ -153,7 +153,12 @@ static int lprocfs_write_lru_size(struct file *file, const char *buffer,
                 return count;
         }
 
-        tmp = simple_strtoul(dummy, NULL, 0);
+        tmp = simple_strtoul(dummy, &end, 0);
+        if (tmp == 0 && *end) {
+                CERROR("invalid value written\n");
+                return -EINVAL;
+        }
+
         CDEBUG(D_DLMTRACE, "changing namespace %s max_unused from %u to %u\n",
                ns->ns_name, ns->ns_max_unused, (unsigned int)tmp);
         ns->ns_max_unused = (unsigned int)tmp;
@@ -451,10 +456,8 @@ ldlm_resource_add(struct ldlm_namespace *ns, struct ldlm_resource *parent,
         struct ldlm_resource *res;
         ENTRY;
 
-        if (type < LDLM_MIN_TYPE || type > LDLM_MAX_TYPE) {
-                LBUG();
-                RETURN(NULL);
-        }
+        LASSERTF(type >= LDLM_MIN_TYPE && type <= LDLM_MAX_TYPE,
+                 "type: %d", type);
 
         res = ldlm_resource_new();
         if (!res) {
@@ -522,13 +525,24 @@ ldlm_resource_get(struct ldlm_namespace *ns, struct ldlm_resource *parent,
         else
                 res = NULL;
 
-        l_unlock(&ns->ns_lock);
 
         if (create && ns->ns_lvbo && ns->ns_lvbo->lvbo_init) {
-                int rc = ns->ns_lvbo->lvbo_init(res);
+                int rc;
+
+                /* Although this is technically a lock inversion risk (lvb_sem
+                 * should be taken before DLM lock), this resource was just
+                 * created, so nobody else can take the lvb_sem yet. -p */
+                down(&res->lr_lvb_sem);
+                /* Drop the dlm lock, because lvbo_init can touch the disk */
+                l_unlock(&ns->ns_lock);
+                OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_CREATE_RESOURCE, 2);
+                rc = ns->ns_lvbo->lvbo_init(res);
+                up(&res->lr_lvb_sem);
                 if (rc)
                         CERROR("lvbo_init failed for resource "LPU64": rc %d\n",
                                name.name[0], rc);
+        } else {
+                l_unlock(&ns->ns_lock);
         }
 
         RETURN(res);
diff --git a/lustre/liblustre/Makefile.am b/lustre/liblustre/Makefile.am
index b831bd8b1e..949c0297e7 100644
--- a/lustre/liblustre/Makefile.am
+++ b/lustre/liblustre/Makefile.am
@@ -1,12 +1,13 @@
 ## Liblustre excecutables & libraries Makefile
 SUBDIRS = . tests
 
-AM_CPPFLAGS = $(HAVE_EFENCE) -I$(SYSIO)/include -D_LARGEFILE64_SOURCE=1 $(LLCPPFLAGS) -I$(top_srcdir)/portals/unals
+AM_CPPFLAGS = $(HAVE_EFENCE) -I$(SYSIO)/include -D_LARGEFILE64_SOURCE=1 \
+              $(LLCPPFLAGS) -I$(top_srcdir)/portals/unals
 AM_CFLAGS = $(LLCFLAGS)
 
 LIBS = $(LIBEFENCE)
 
-LUSTRE_LIBS = libllite.a \
+LUSTRE_LIBS = liblutils.a libllite.a \
               $(top_builddir)/lov/liblov.a \
               $(top_builddir)/obdecho/libobdecho.a \
               $(top_builddir)/osc/libosc.a \
@@ -15,26 +16,46 @@ LUSTRE_LIBS = libllite.a \
               $(top_builddir)/obdclass/liblustreclass.a \
               $(top_builddir)/lvfs/liblvfs.a
 
+if !CRAY_PORTALS
 PTL_LIBS =    $(top_builddir)/portals/utils/libuptlctl.a \
               $(top_builddir)/portals/unals/libtcpnal.a \
               $(top_builddir)/portals/portals/libportals.a
+else
+PTL_LIBS =    $(top_builddir)/portals/utils/libuptlctl.a \
+              $(CRAY_PORTALS_PATH)/lib_TV/snos64/libportals.a
+endif
 
-SYSIO_LIBS =  $(SYSIO)/drivers/native/libsysio_native.a \
-              $(SYSIO)/drivers/sockets/libsysio_sockets.a \
-              $(SYSIO)/src/libsysio.a \
-              $(SYSIO)/dev/stdfd/libsysio_stdfd.a
+SYSIO_LIBS =  $(SYSIO)/lib/libsysio.a
 
 if LIBLUSTRE
 lib_LIBRARIES = liblustre.a
-noinst_LIBRARIES = libllite.a
+noinst_LIBRARIES = liblutils.a libllite.a
+
+install-exec-hook: liblustre.so
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(libdir)
+	@list=$< ; for p in $$list; do \
+	  if test -f $$p; then \
+	    f="`echo $$p | sed -e 's|^.*/||'`"; \
+	    echo " $(libLIBRARIES_INSTALL) $$p $(DESTDIR)$(libdir)/$$f"; \
+	    $(libLIBRARIES_INSTALL) $$p $(DESTDIR)$(libdir)/$$f; \
+	  else :; fi; \
+	done
+else
+install-exec-hook:
 endif
 
-libllite_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c llite_lib.h
+liblutils_a_SOURCES = lutil.c lutil.h
+
+libllite_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c \
+		     llite_lib.h
 
 # for make rpms -- need cleanup
 liblustre_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c
 
 liblustre.a : $(LUSTRE_LIBS) $(PTL_LIBS) $(SYSIO_LIBS)
-	$(srcdir)/genlib.sh $(SYSIO) $(AR) $(LINK) || ( rm -f $@; exit 1 )
+	sh $(srcdir)/genlib.sh $(SYSIO) $(CRAY_PORTALS_PATH)
 
 EXTRA_DIST = genlib.sh
+
+CLEANFILES := liblsupport.a liblustre.so
diff --git a/lustre/liblustre/dir.c b/lustre/liblustre/dir.c
index 05fc15365f..3b9b0f6abb 100644
--- a/lustre/liblustre/dir.c
+++ b/lustre/liblustre/dir.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light directory handling
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -42,8 +42,8 @@
 #undef LIST_HEAD
 
 #include <linux/types.h>
-#include <linux/dirent.h>
 #include <linux/unistd.h>
+#include <dirent.h>
 
 #include "llite_lib.h"
 
@@ -65,16 +65,6 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page)
         ldlm_policy_data_t policy = { .l_inodebits = { MDS_INODELOCK_UPDATE } };
         ENTRY;
 
-        if ((lli->lli_st_size + PAGE_CACHE_SIZE - 1) >> PAGE_SHIFT <= page->index) {
-                /* XXX why do we need this exactly, and why do we think that
-                 *     an all-zero directory page is useful?
-                 */
-                CERROR("memsetting dir page %lu to zero (size %lld)\n",
-                       page->index, lli->lli_st_size);
-                memset(page->addr, 0, PAGE_CACHE_SIZE);
-                GOTO(readpage_out, rc);
-        }
-
         rc = ldlm_lock_match(obddev->obd_namespace, LDLM_FL_BLOCK_GRANTED,
                              &res_id, LDLM_IBITS, &policy, LCK_PR, &lockh);
         if (!rc) {
@@ -105,11 +95,12 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page)
                 LASSERT_REPSWABBED (request, 0); /* swabbed by mdc_readpage() */
 
                 lli->lli_st_size = body->size;
+        } else {
+                CERROR("read_dir_page(%ld) error %d\n", page->index, rc);
         }
         ptlrpc_req_finished(request);
         EXIT;
 
- readpage_out:
         ldlm_lock_decref(&lockh, LCK_PR);
         return rc;
 }
@@ -136,6 +127,29 @@ static struct page *llu_dir_read_page(struct inode *ino, int pgidx)
         return page;
 }
 
+enum {
+        EXT2_FT_UNKNOWN,
+        EXT2_FT_REG_FILE,
+        EXT2_FT_DIR,
+        EXT2_FT_CHRDEV,
+        EXT2_FT_BLKDEV,
+        EXT2_FT_FIFO,
+        EXT2_FT_SOCK,
+        EXT2_FT_SYMLINK,
+        EXT2_FT_MAX
+};
+
+static unsigned char ext2_filetype_table[EXT2_FT_MAX] = {
+        [EXT2_FT_UNKNOWN]       DT_UNKNOWN,
+        [EXT2_FT_REG_FILE]      DT_REG,
+        [EXT2_FT_DIR]           DT_DIR,
+        [EXT2_FT_CHRDEV]        DT_CHR,
+        [EXT2_FT_BLKDEV]        DT_BLK,
+        [EXT2_FT_FIFO]          DT_FIFO,
+        [EXT2_FT_SOCK]          DT_SOCK,
+        [EXT2_FT_SYMLINK]       DT_LNK,
+};
+
 #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
 #define ROUND_UP64(x)   (((x)+sizeof(__u64)-1) & ~(sizeof(__u64)-1))
 
@@ -170,12 +184,19 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes,
         int maxpages, pgidx, filled = 0;
         ENTRY;
 
+        if (lli->lli_st_size == 0) {
+                CWARN("dir size is 0?\n");
+                RETURN(0);
+        }
+
+        liblustre_wait_event(0);
+
         if (pos == -1)
                 pos = lli->lli_dir_pos;
 
-        maxpages = lli->lli_st_size >> PAGE_CACHE_SHIFT;
-        pgidx = pos >> PAGE_CACHE_SHIFT;
-        offset = pos & ~PAGE_CACHE_MASK;
+        maxpages = (lli->lli_st_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+        pgidx = pos >> PAGE_SHIFT;
+        offset = pos & ~PAGE_MASK;
 
         for ( ; pgidx < maxpages ; pgidx++, offset = 0) {
                 struct page *page;
@@ -187,23 +208,24 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes,
                         continue;
 
                 /* size might have been updated by mdc_readpage */
-                maxpages = lli->lli_st_size >> PAGE_CACHE_SHIFT;
+                maxpages = (lli->lli_st_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
                 /* fill in buffer */
                 addr = page->addr;
-                limit = addr + PAGE_CACHE_SIZE - EXT2_DIR_REC_LEN(1);
+                limit = addr + PAGE_SIZE - EXT2_DIR_REC_LEN(1);
                 de = (struct ext2_dirent *) (addr + offset);
 
                 for ( ; (char*) de <= limit; de = ext2_next_entry(de)) {
                         if (de->inode) {
                                 int over;
-                                unsigned char d_type = 0;
+                                unsigned char d_type = DT_UNKNOWN;
 
-                                /* XXX handle type, etc here */
+                                if (de->file_type < EXT2_FT_MAX)
+                                        d_type = ext2_filetype_table[de->file_type];
 
                                 offset = (char*) de - addr;
                                 over =  filldir(buf, nbytes, de->name, de->name_len,
-                                                (pgidx << PAGE_CACHE_SHIFT) | offset,
+                                                (pgidx << PAGE_SHIFT) | offset,
                                                 le32_to_cpu(de->inode), d_type, &filled);
                                 if (over) {
                                         free_page(page);
@@ -215,7 +237,7 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes,
                 free_page(page);
         }
 done:
-        lli->lli_dir_pos = pgidx << PAGE_CACHE_SHIFT | offset;
+        lli->lli_dir_pos = pgidx << PAGE_SHIFT | offset;
         *basep = lli->lli_dir_pos;
         RETURN(filled);
 }
diff --git a/lustre/liblustre/file.c b/lustre/liblustre/file.c
index 8028427e90..0ceefdbba9 100644
--- a/lustre/liblustre/file.c
+++ b/lustre/liblustre/file.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light file operations
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -29,7 +29,9 @@
 #include <time.h>
 #include <sys/types.h>
 #include <sys/queue.h>
+#include <fcntl.h>
 
+#include <xtio.h>
 #include <sysio.h>
 #include <fs.h>
 #include <mount.h>
@@ -133,6 +135,8 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode)
         int rc = 0;
         ENTRY;
 
+        liblustre_wait_event(0);
+
         /* don't do anything for '/' */
         if (llu_is_root_inode(inode))
                 RETURN(0);
@@ -166,7 +170,7 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode)
         }
         fd->fd_flags &= ~O_LOV_DELAY_CREATE;
 
-        lli->lli_open_flags = flags;
+        lli->lli_open_flags = flags & ~(O_CREAT | O_EXCL | O_TRUNC);
 
  out_release:
         request = it->d.lustre.it_data;
@@ -175,6 +179,22 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode)
         it->it_op_release(it);
         OBD_FREE(it, sizeof(*it));
 
+        /* libsysio haven't doing anything for O_TRUNC. here we
+         * simply simulate it as open(...); truncate(...);
+         */
+        if (rc == 0 && (flags & O_TRUNC) &&
+            S_ISREG(lli->lli_st_mode)) {
+                struct iattr attr;
+
+                memset(&attr, 0, sizeof(attr));
+                attr.ia_size = 0;
+                attr.ia_valid |= ATTR_SIZE | ATTR_RAW;
+                rc  = llu_setattr_raw(inode, &attr);
+                if (rc) {
+                        CERROR("error %d truncate in open()\n", rc);
+                }
+        }
+
         RETURN(rc);
 }
 
@@ -332,54 +352,34 @@ int llu_file_release(struct inode *inode)
         RETURN(rc);
 }
 
+/*
+ * libsysio require us return 0
+ */
 int llu_iop_close(struct inode *inode)
 {
         int rc;
 
+        liblustre_wait_event(0);
+
         rc = llu_file_release(inode);
+        if (rc) {
+                CERROR("file close error %d\n", rc);
+        }
         /* if open count == 0 && stale_flag is set, should we
          * remove the inode immediately? */
-        return rc;
+        return 0;
 }
 
-int llu_iop_ipreadv(struct inode *ino,
-                    struct ioctx *ioctx)
+_SYSIO_OFF_T llu_iop_pos(struct inode *ino, _SYSIO_OFF_T off)
 {
         ENTRY;
 
-        if (!ioctx->ioctx_iovlen)
-                RETURN(0);
-        if (ioctx->ioctx_iovlen < 0)
-                RETURN(-EINVAL);
+        liblustre_wait_event(0);
 
-        ioctx->ioctx_private = llu_file_read(ino,
-                                        ioctx->ioctx_iovec,
-                                        ioctx->ioctx_iovlen,
-                                        ioctx->ioctx_offset);
-        if (IS_ERR(ioctx->ioctx_private))
-                return (PTR_ERR(ioctx->ioctx_private));
-
-        RETURN(0);
-}
-
-int llu_iop_ipwritev(struct inode *ino,
-                     struct ioctx *ioctx)
-{
-        ENTRY;
-
-        if (!ioctx->ioctx_iovlen)
-                RETURN(0);
-        if (ioctx->ioctx_iovlen < 0)
+        if (off < 0 || off > ll_file_maxbytes(ino))
                 RETURN(-EINVAL);
 
-        ioctx->ioctx_private = llu_file_write(ino,
-                                         ioctx->ioctx_iovec,
-                                         ioctx->ioctx_iovlen,
-                                         ioctx->ioctx_offset);
-        if (IS_ERR(ioctx->ioctx_private))
-                return (PTR_ERR(ioctx->ioctx_private));
-
-        RETURN(0);
+        RETURN(off);
 }
 
 /* this isn't where truncate starts.   roughly:
diff --git a/lustre/liblustre/genlib.sh b/lustre/liblustre/genlib.sh
index c31ea2f75a..efbae700a8 100755
--- a/lustre/liblustre/genlib.sh
+++ b/lustre/liblustre/genlib.sh
@@ -4,7 +4,10 @@
 #
 # This script is to generate lib lustre library as a whole. It will leave
 # two files on current directory: liblustre.a and liblustre.so.
-# Integrate them into Makefile.am later
+#
+# Most concern here is the libraries linking order
+#
+# FIXME: How to do this cleanly use makefile?
 #
 
 AR=/usr/bin/ar
@@ -14,14 +17,15 @@ RANLIB=/usr/bin/ranlib
 CWD=`pwd`
 
 SYSIO=$1
+CRAY_PORTALS_PATH=$2
+
+if [ ! -f $SYSIO/lib/libsysio.a ]; then
+  echo "ERROR: $SYSIO/lib/libsysio.a dosen't exist"
+  exit 1
+fi
 
-#if [ ! -f $SYSIO/lib/libsysio.a ]; then
-#  echo "ERROR: $SYSIO/lib/libsysio.a dosen't exist"
-#  exit 1
-#fi
-#
 # do cleanup at first
-#rm -f liblustre.so
+rm -f liblustre.so
 
 ALL_OBJS=
 
@@ -32,22 +36,47 @@ build_obj_list() {
   done;
 }
 
+prepend_obj_list() {
+  _objs=`$AR -t $1/$2`
+  for _lib in $_objs; do
+    ALL_OBJS="$1/$_lib "$ALL_OBJS;
+  done;
+}
+
 #
 # special treatment for libsysio
 #
-#sysio_tmp=$CWD/sysio_tmp_`date +%s`
-#build_sysio_obj_list() {
-#  _objs=`$AR -t $1`
-#  mkdir -p $sysio_tmp
-#  $AR -x $1
-#  mv $_objs $sysio_tmp
-#  for _lib in $_objs; do
-#    ALL_OBJS=$ALL_OBJS"$sysio_tmp/$_lib ";
-#  done
-#}
+sysio_tmp=$CWD/sysio_tmp_`date +%s`
+rm -rf $sysio_tmp
+build_sysio_obj_list() {
+  _objs=`$AR -t $1`
+  mkdir -p $sysio_tmp
+  cd $sysio_tmp
+  $AR -x $1
+  cd ..
+  for _lib in $_objs; do
+    ALL_OBJS=$ALL_OBJS"$sysio_tmp/$_lib ";
+  done
+}
+
+#
+# special treatment for libportals.a
+#
+cray_tmp=$CWD/cray_tmp_`date +%s`
+rm -rf $cray_tmp
+build_cray_portals_obj_list() {
+  _objs=`$AR -t $1`
+  mkdir -p $cray_tmp
+  cd $cray_tmp
+  $AR -x $1
+  cd ..
+  for _lib in $_objs; do
+    ALL_OBJS=$ALL_OBJS"$cray_tmp/$_lib ";
+  done
+}
 
 # lustre components libs
-build_obj_list . libllite.a
+build_obj_list . liblutils.a
 build_obj_list ../lov liblov.a
 build_obj_list ../obdecho libobdecho.a
 build_obj_list ../osc libosc.a
@@ -58,22 +87,24 @@ build_obj_list ../lvfs liblvfs.a
 
 # portals components libs
 build_obj_list ../portals/utils libuptlctl.a
-build_obj_list ../portals/unals libtcpnal.a
-build_obj_list ../portals/portals libportals.a
+
+if [ "x$CRAY_PORTALS_PATH" = "x" ]; then
+  build_obj_list ../portals/unals libtcpnal.a
+  build_obj_list ../portals/portals libportals.a
+else
+  build_cray_portals_obj_list $CRAY_PORTALS_PATH/lib_TV/snos64/libportals.a
+fi
 
 # create static lib lsupport
 rm -f $CWD/liblsupport.a
 $AR -cru $CWD/liblsupport.a $ALL_OBJS
 $RANLIB $CWD/liblsupport.a
 
-# libsysio components libs
-build_obj_list $SYSIO/drivers/native libsysio_native.a
-build_obj_list $SYSIO/drivers/sockets libsysio_sockets.a
-build_obj_list $SYSIO/src libsysio.a
-build_obj_list $SYSIO/dev/stdfd libsysio_stdfd.a
-#
-#build_sysio_obj_list $SYSIO/lib/libsysio.a
-#
+# libllite should be at the beginning of obj list
+prepend_obj_list . libllite.a
+
+# libsysio
+build_sysio_obj_list $SYSIO/lib/libsysio.a
 
 # create static lib lustre
 rm -f $CWD/liblustre.a
@@ -85,4 +116,5 @@ rm -f $CWD/liblustre.so
 $LD -shared -o $CWD/liblustre.so -init __liblustre_setup_ -fini __liblustre_cleanup_ \
 	$ALL_OBJS -lcap -lpthread
 
-#rm -rf $sysio_tmp
+rm -rf $sysio_tmp
+rm -rf $cray_tmp
diff --git a/lustre/liblustre/llite_lib.c b/lustre/liblustre/llite_lib.c
index 73f97da7e4..88c92d1480 100644
--- a/lustre/liblustre/llite_lib.c
+++ b/lustre/liblustre/llite_lib.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light common routines
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -25,342 +25,33 @@
 #include <string.h>
 #include <assert.h>
 #include <signal.h>
-#include <fcntl.h>
-#include <netdb.h>
-#include <syscall.h>
-#include <sys/utsname.h>
 #include <sys/types.h>
 #include <sys/queue.h>
 
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-
 #include <sysio.h>
 #include <fs.h>
 #include <mount.h>
 #include <inode.h>
 #include <file.h>
 
+#ifdef REDSTORM
+#define CSTART_INIT
+#endif
+
 /* both sys/queue.h (libsysio require it) and portals/lists.h have definition
  * of 'LIST_HEAD'. undef it to suppress warnings
  */
 #undef LIST_HEAD
+#include <portals/ptlctl.h>
 
-#include <portals/ptlctl.h>	/* needed for parse_dump */
-#include <procbridge.h>
-
+#include "lutil.h"
 #include "llite_lib.h"
 
-unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
-                                            S_GMNAL | S_IBNAL);
-
-ptl_handle_ni_t         tcpnal_ni;
-struct task_struct     *current;
-
-/* portals interfaces */
-
-struct ldlm_namespace;
-struct ldlm_res_id;
-struct obd_import;
-
-void *inter_module_get(char *arg)
-{
-        if (!strcmp(arg, "tcpnal_ni"))
-                return &tcpnal_ni;
-        else if (!strcmp(arg, "ldlm_cli_cancel_unused"))
-                return ldlm_cli_cancel_unused;
-        else if (!strcmp(arg, "ldlm_namespace_cleanup"))
-                return ldlm_namespace_cleanup;
-        else if (!strcmp(arg, "ldlm_replay_locks"))
-                return ldlm_replay_locks;
-        else
-                return NULL;
-}
-
-/* XXX move to proper place */
-char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
-{
-        switch(nal){
-        case TCPNAL:
-                /* userspace NAL */
-        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;
-        default:
-                snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
-                         nal, (long long)nid);
-                break;
-        }
-        return str;
-}
-/*      bug #4615       */
-char *portals_id2str(int nal, ptl_process_id_t id, char *str)
-{
-        switch(nal){
-        case TCPNAL:
-                /* userspace NAL */
-        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;
-        default:
-                snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx,%lx",
-                         nal, (long long)id.nid, (long)id.pid );
-                break;
-        }
-        return str;
-}
-/*
- * random number generator stuff
- */
-static int _rand_dev_fd = -1;
-
-static int get_ipv4_addr()
-{
-        struct utsname myname;
-        struct hostent *hptr;
-        int ip;
-
-        if (uname(&myname) < 0)
-                return 0;
-
-        hptr = gethostbyname(myname.nodename);
-        if (hptr == NULL ||
-            hptr->h_addrtype != AF_INET ||
-            *hptr->h_addr_list == NULL) {
-                printf("LibLustre: Warning: fail to get local IPv4 address\n");
-                return 0;
-        }
-
-        ip = ntohl(*((int *) *hptr->h_addr_list));
-
-        return ip;
-}
-
-static void init_random()
-{
-        int seed;
-        struct timeval tv;
-
-        _rand_dev_fd = syscall(SYS_open, "/dev/urandom", O_RDONLY);
-        if (_rand_dev_fd >= 0) {
-                if (syscall(SYS_read, _rand_dev_fd, &seed, sizeof(int)) ==
-                    sizeof(int)) {
-                        srand(seed);
-                        return;
-                }
-                syscall(SYS_close, _rand_dev_fd);
-                _rand_dev_fd = -1;
-        }
-
-        gettimeofday(&tv, NULL);
-        srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(get_ipv4_addr()));
-}
-
-void get_random_bytes(void *buf, int size)
-{
-        char *p = buf;
-
-        if (size < 1)
-                return;
-
-        if (_rand_dev_fd >= 0) {
-                if (syscall(SYS_read, _rand_dev_fd, buf, size) == size)
-                        return;
-                syscall(SYS_close, _rand_dev_fd);
-                _rand_dev_fd = -1;
-        }
-
-        while (size--) 
-                *p++ = rand();
-}
-
-int in_group_p(gid_t gid)
-{
-        int i;
-
-        if (gid == current->fsgid)
-                return 1;
-
-        for (i = 0; i < current->ngroups; i++) {
-                if (gid == current->groups[i])
-                        return 1;
-        }
-
-        return 0;
-}
-
-static void init_capability(int *res)
-{
-        cap_t syscap;
-        cap_flag_value_t capval;
-        int i;
-
-        *res = 0;
-
-        syscap = cap_get_proc();
-        if (!syscap) {
-                printf("Liblustre: Warning: failed to get system capability, "
-                       "set to minimal\n");
-                return;
-        }
-
-        for (i = 0; i < sizeof(cap_value_t) * 8; i++) {
-                if (!cap_get_flag(syscap, i, CAP_EFFECTIVE, &capval)) {
-                        if (capval == CAP_SET) {
-                                *res |= 1 << i;
-                        }
-                }
-        }
-}
-
-static int init_current(char *comm)
-{
-        current = malloc(sizeof(*current));
-        if (!current) {
-                CERROR("Not enough memory\n");
-                return -ENOMEM;
-        }
-        current->fs = &current->__fs;
-        current->fs->umask = umask(0777);
-        umask(current->fs->umask);
-
-        strncpy(current->comm, comm, sizeof(current->comm));
-        current->pid = getpid();
-        current->fsuid = geteuid();
-        current->fsgid = getegid();
-        memset(&current->pending, 0, sizeof(current->pending));
-
-        current->max_groups = sysconf(_SC_NGROUPS_MAX);
-        current->groups = malloc(sizeof(gid_t) * current->max_groups);
-        if (!current->groups) {
-                CERROR("Not enough memory\n");
-                return -ENOMEM;
-        }
-        current->ngroups = getgroups(current->max_groups, current->groups);
-        if (current->ngroups < 0) {
-                perror("Error getgroups");
-                return -EINVAL;
-        }
-
-        init_capability(&current->cap_effective);
-
-        return 0;
-}
-
-void generate_random_uuid(unsigned char uuid_out[16])
-{
-        get_random_bytes(uuid_out, sizeof(uuid_out));
-}
-
-ptl_nid_t tcpnal_mynid;
-
-int init_lib_portals()
-{
-        int max_interfaces;
-        int rc;
-        ENTRY;
-
-        rc = PtlInit(&max_interfaces);
-        if (rc != PTL_OK) {
-                CERROR("PtlInit failed: %d\n", rc);
-                RETURN (-ENXIO);
-        }
-        RETURN(0);
-}
-
-int
-libcfs_nal_cmd(struct portals_cfg *pcfg)
-{
-        /* handle portals command if we want */
-        return 0;
-}
-
-extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
-
-int lib_ioctl_nalcmd(int dev_id, unsigned int opc, void * ptr)
-{
-        struct portal_ioctl_data *ptldata;
-
-        if (opc == IOC_PORTAL_NAL_CMD) {
-                ptldata = (struct portal_ioctl_data *) ptr;
-
-                if (ptldata->ioc_nal_cmd == NAL_CMD_REGISTER_MYNID) {
-                        tcpnal_mynid = ptldata->ioc_nid;
-                        printf("mynid: %u.%u.%u.%u\n",
-                                (unsigned)(tcpnal_mynid>>24) & 0xFF,
-                                (unsigned)(tcpnal_mynid>>16) & 0xFF,
-                                (unsigned)(tcpnal_mynid>>8) & 0xFF,
-                                (unsigned)(tcpnal_mynid) & 0xFF);
-                }
-        }
-
-	return (0);
-}
-
-int lib_ioctl(int dev_id, unsigned int opc, void * ptr)
+static int lllib_init(void)
 {
-        int rc;
+        liblustre_set_nal_nid();
 
-	if (dev_id == OBD_DEV_ID) {
-                struct obd_ioctl_data *ioc = ptr;
-
-                //XXX hack!!!
-                ioc->ioc_plen1 = ioc->ioc_inllen1;
-                ioc->ioc_pbuf1 = ioc->ioc_bulk;
-                //XXX
-
-                rc = class_handle_ioctl(opc, (unsigned long)ptr);
-
-                printf ("proccssing ioctl cmd: %x, rc %d\n", opc,  rc);
-
-                if (rc)
-                        return rc;
-	}
-	return (0);
-}
-
-int lllib_init(char *dumpfile)
-{
-        pid_t pid;
-        uint32_t ip;
-        struct in_addr in;
-
-        if (!g_zconf) {
-                /* this parse only get my nid from config file
-                 * before initialize portals
-                 */
-                if (parse_dump(dumpfile, lib_ioctl_nalcmd))
-                        return -1;
-        } else {
-                /* need to setup mynid before tcpnal initialization */
-                /* a meaningful nid could help debugging */
-                ip = get_ipv4_addr();
-                if (ip == 0)
-                        get_random_bytes(&ip, sizeof(ip));
-                pid = getpid() & 0xffffffff;
-                tcpnal_mynid = ((uint64_t)ip << 32) | pid;
-
-                in.s_addr = htonl(ip);
-                printf("LibLustre: TCPNAL NID: %016llx (%s:%u)\n", 
-                       tcpnal_mynid, inet_ntoa(in), pid);
-        }
-
-        if (init_current("dummy") ||
+        if (liblustre_init_current("dummy") ||
             init_obdclass() ||
             init_lib_portals() ||
             ptlrpc_init() ||
@@ -369,17 +60,15 @@ int lllib_init(char *dumpfile)
             osc_init())
                 return -1;
 
-        if (!g_zconf && parse_dump(dumpfile, lib_ioctl))
-                return -1;
-
         return _sysio_fssw_register("llite", &llu_fssw_ops);
 }
  
-#if 0
-static void llu_check_request()
-{
-        liblustre_wait_event(0);
-}
+#ifndef CRAY_PORTALS
+#define LIBLUSTRE_NAL_NAME "tcp"
+#elif defined REDSTORM
+#define LIBLUSTRE_NAL_NAME "cray_qk_ernal"
+#else
+#define LIBLUSTRE_NAL_NAME "cray_pb_ernal"
 #endif
 
 int liblustre_process_log(struct config_llog_instance *cfg, int allow_recov)
@@ -405,9 +94,9 @@ int liblustre_process_log(struct config_llog_instance *cfg, int allow_recov)
                 RETURN(-EINVAL);
         }
 
-        nal = ptl_name2nal("tcp");
+        nal = ptl_name2nal(LIBLUSTRE_NAL_NAME);
         if (nal <= 0) {
-                CERROR("Can't parse NAL tcp\n");
+                CERROR("Can't parse NAL %s\n", LIBLUSTRE_NAL_NAME);
                 RETURN(-EINVAL);
         }
         LCFG_INIT(lcfg, LCFG_ADD_UUID, NULL);
@@ -446,7 +135,7 @@ int liblustre_process_log(struct config_llog_instance *cfg, int allow_recov)
                            strlen("initial_recov"), "initial_recov",
                            sizeof(allow_recov), &allow_recov);
 
-        err = obd_connect(&mdc_conn, obd, &mdc_uuid);
+        err = obd_connect(&mdc_conn, obd, &mdc_uuid, 0);
         if (err) {
                 CERROR("cannot connect to %s: rc = %d\n",
                         g_zconf_mdsname, err);
@@ -456,9 +145,10 @@ int liblustre_process_log(struct config_llog_instance *cfg, int allow_recov)
         exp = class_conn2export(&mdc_conn);
         
         ctxt = exp->exp_obd->obd_llog_ctxt[LLOG_CONFIG_REPL_CTXT];
-        rc = class_config_process_llog(ctxt, g_zconf_profile, &lcfg);
-        if (rc)
-                CERROR("class_config_process_llog failed: rc = %d\n", rc);
+        rc = class_config_process_llog(ctxt, g_zconf_profile, cfg);
+        if (rc) {
+                CERROR("class_config_parse_llog failed: rc = %d\n", rc);
+        }
 
         err = obd_disconnect(exp, 0);
 
@@ -514,18 +204,63 @@ int ll_parse_mount_target(const char *target, char **mdsnid,
         return -1;
 }
 
+/*
+ * early liblustre init
+ * called from C startup in catamount apps, before main()
+ *
+ * The following is a skeleton sysio startup sequence,
+ * as implemented in C startup (skipping error handling).
+ * In this framework none of these calls need be made here
+ * or in the apps themselves.  The NAMESPACE_STRING specifying
+ * the initial set of fs ops (creates, mounts, etc.) is passed
+ * as an environment variable.
+ * 
+ *      _sysio_init();
+ *      _sysio_incore_init();
+ *      _sysio_native_init();
+ *      _sysio_lustre_init();
+ *      _sysio_boot(NAMESPACE_STRING);
+ *
+ * the name _sysio_lustre_init() follows the naming convention
+ * established in other fs drivers from libsysio:
+ *  _sysio_incore_init(), _sysio_native_init()
+ *
+ * _sysio_lustre_init() must be called before _sysio_boot()
+ * to enable libsysio's processing of namespace init strings containing
+ * lustre filesystem operations
+ */
+int _sysio_lustre_init(void)
+{
+        int err;
+
+#if 0
+        portal_debug = -1;
+        portal_subsystem_debug = -1;
+#endif
+
+        liblustre_init_random();
+
+        err = lllib_init();
+        if (err) {
+                perror("init llite driver");
+        }       
+        return err;
+}
+
 /* env variables */
 #define ENV_LUSTRE_MNTPNT               "LIBLUSTRE_MOUNT_POINT"
 #define ENV_LUSTRE_MNTTGT               "LIBLUSTRE_MOUNT_TARGET"
 #define ENV_LUSTRE_TIMEOUT              "LIBLUSTRE_TIMEOUT"
 #define ENV_LUSTRE_DUMPFILE             "LIBLUSTRE_DUMPFILE"
+#define ENV_LUSTRE_DEBUG_MASK           "LIBLUSTRE_DEBUG_MASK"
+#define ENV_LUSTRE_DEBUG_SUBSYS         "LIBLUSTRE_DEBUG_SUBSYS"
 
 extern int _sysio_native_init();
-
 extern unsigned int obd_timeout;
 
+static char *lustre_path = NULL;
+
 /* global variables */
-int     g_zconf = 0;            /* zeroconf or dumpfile */
 char   *g_zconf_mdsname = NULL; /* mdsname, for zeroconf */
 char   *g_zconf_mdsnid = NULL;  /* mdsnid, for zeroconf */
 char   *g_zconf_profile = NULL; /* profile, for zeroconf */
@@ -533,10 +268,10 @@ char   *g_zconf_profile = NULL; /* profile, for zeroconf */
 
 void __liblustre_setup_(void)
 {
-        char *lustre_path = NULL;
         char *target = NULL;
         char *timeout = NULL;
-        char *dumpfile = NULL;
+        char *debug_mask = NULL;
+        char *debug_subsys = NULL;
         char *root_driver = "native";
         char *lustre_driver = "llite";
         char *root_path = "/";
@@ -548,45 +283,50 @@ void __liblustre_setup_(void)
                 lustre_path = "/mnt/lustre";
 	}
 
+        /* mount target */
         target = getenv(ENV_LUSTRE_MNTTGT);
         if (!target) {
-                dumpfile = getenv(ENV_LUSTRE_DUMPFILE);
-                if (!dumpfile) {
-                        CERROR("Neither mount target, nor dumpfile\n");
-                        exit(1);
-                }
-                g_zconf = 0;
-                printf("LibLustre: mount point %s, dumpfile %s\n",
-                        lustre_path, dumpfile);
-        } else {
-                if (ll_parse_mount_target(target,
-                                          &g_zconf_mdsnid,
-                                          &g_zconf_mdsname,
-                                          &g_zconf_profile)) {
-                        CERROR("mal-formed target %s \n", target);
-                        exit(1);
-                }
-                g_zconf = 1;
-                printf("LibLustre: mount point %s, target %s\n",
-                        lustre_path, target);
+                printf("LibLustre: no mount target specified\n");
+                exit(1);
+        }
+        if (ll_parse_mount_target(target,
+                                  &g_zconf_mdsnid,
+                                  &g_zconf_mdsname,
+                                  &g_zconf_profile)) {
+                CERROR("mal-formed target %s \n", target);
+                exit(1);
         }
+        if (!g_zconf_mdsnid || !g_zconf_mdsname || !g_zconf_profile) {
+                printf("Liblustre: invalid target %s\n", target);
+                exit(1);
+        }
+        printf("LibLustre: mount point %s, target %s\n",
+                lustre_path, target);
 
         timeout = getenv(ENV_LUSTRE_TIMEOUT);
         if (timeout) {
-                obd_timeout = (unsigned int) atoi(timeout);
+                obd_timeout = (unsigned int) strtol(timeout, NULL, 0);
                 printf("LibLustre: set obd timeout as %u seconds\n",
                         obd_timeout);
         }
 
-	if (_sysio_init() != 0) {
+        /* debug masks */
+        debug_mask = getenv(ENV_LUSTRE_DEBUG_MASK);
+        if (debug_mask)
+                portal_debug = (unsigned int) strtol(debug_mask, NULL, 0);
+
+        debug_subsys = getenv(ENV_LUSTRE_DEBUG_SUBSYS);
+        if (debug_subsys)
+                portal_subsystem_debug =
+                                (unsigned int) strtol(debug_subsys, NULL, 0);
+
+#ifndef CSTART_INIT
+        /* initialize libsysio & mount rootfs */
+	if (_sysio_init()) {
 		perror("init sysio");
 		exit(1);
 	}
-
-        /* cygwin don't need native driver */
-#ifndef __CYGWIN__
         _sysio_native_init();
-#endif
 
 	err = _sysio_mount_root(root_path, root_driver, mntflgs, NULL);
 	if (err) {
@@ -594,17 +334,9 @@ void __liblustre_setup_(void)
 		exit(1);
 	}
 
-#if 1
-	portal_debug = 0;
-	portal_subsystem_debug = 0;
-#endif
-        init_random();
-
-	err = lllib_init(dumpfile);
-	if (err) {
-		perror("init llite driver");
+        if (_sysio_lustre_init())
 		exit(1);
-	}	
+#endif
 
         err = mount("/", lustre_path, lustre_driver, mntflgs, NULL);
 	if (err) {
@@ -612,15 +344,26 @@ void __liblustre_setup_(void)
 		perror(lustre_driver);
 		exit(1);
 	}
-
-#if 0
-        __sysio_hook_sys_enter = llu_check_request;
-        __sysio_hook_sys_leave = NULL;
-#endif
 }
 
 void __liblustre_cleanup_(void)
 {
-	_sysio_shutdown();
+        /* user app might chdir to a lustre directory, and leave busy pnode
+         * during finaly libsysio cleanup. here we chdir back to "/".
+         * but it can't fix the situation that liblustre is mounted
+         * at "/".
+         */
+        chdir("/");
+#if 0
+        umount(lustre_path);
+#endif
+        /* we can't call umount here, because libsysio will not cleanup
+         * opening files for us. _sysio_shutdown() will cleanup fds at
+         * first but which will also close the sockets we need for umount
+         * liblutre. this delima lead to another hack in
+         * libsysio/src/file_hack.c FIXME
+         */
+        _sysio_shutdown();
+        cleanup_lib_portals();
         PtlFini();
 }
diff --git a/lustre/liblustre/llite_lib.h b/lustre/liblustre/llite_lib.h
index 27432c470f..6c0c61d674 100644
--- a/lustre/liblustre/llite_lib.h
+++ b/lustre/liblustre/llite_lib.h
@@ -3,7 +3,7 @@
  *
  * Lustre Light Super operations
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -78,8 +78,6 @@ struct llu_inode_info {
 
         struct lookup_intent   *lli_it;
 
-        /* XXX workaround for libsysio unlink */
-        int                     lli_stale_flag;
         /* XXX workaround for libsysio readdir */
         loff_t                  lli_dir_pos;
 
@@ -101,38 +99,14 @@ struct llu_inode_info {
         dev_t                   lli_st_rdev;
         loff_t                  lli_st_size;
         unsigned int            lli_st_blksize;
-        unsigned int            lli_st_blocks;
+        unsigned long           lli_st_blocks;
         time_t                  lli_st_atime;
         time_t                  lli_st_mtime;
         time_t                  lli_st_ctime;
 
         /* not for stat, change it later */
-        int			lli_st_flags;
-        unsigned long 		lli_st_generation;
-};
-
-#define LLU_SYSIO_COOKIE_SIZE(x) \
-        (sizeof(struct llu_sysio_cookie) + \
-         sizeof(struct ll_async_page) * (x) + \
-         sizeof(struct page) * (x))
-
-struct llu_sysio_cookie {
-        struct obd_io_group    *lsc_oig;
-        struct inode           *lsc_inode;
-        int                     lsc_maxpages;
-        int                     lsc_npages;
-        struct ll_async_page   *lsc_llap;
-        struct page            *lsc_pages;
-        __u64                   lsc_rwcount;
-};
-
-/* XXX why uio.h haven't the definition? */
-#define MAX_IOVEC 32
-
-struct llu_sysio_callback_args
-{
-        int ncookies;
-        struct llu_sysio_cookie *cookies[MAX_IOVEC];
+        int                     lli_st_flags;
+        unsigned long           lli_st_generation;
 };
 
 static inline struct llu_sb_info *llu_fs2sbi(struct filesys *fs)
@@ -203,43 +177,12 @@ struct it_cb_data {
         obd_id hash;
 };
 
-static inline void ll_i2uctxt(struct ll_uctxt *ctxt, struct inode *i1,
-                              struct inode *i2)
-{
-        struct llu_inode_info *lli1 = llu_i2info(i1);
-        struct llu_inode_info *lli2;
-
-        LASSERT(i1);
-        LASSERT(ctxt);
-
-        if (in_group_p(lli1->lli_st_gid))
-                ctxt->gid1 = lli1->lli_st_gid;
-        else
-                ctxt->gid1 = -1;
-
-        if (i2) {
-        	lli2 = llu_i2info(i2);
-                if (in_group_p(lli2->lli_st_gid))
-                        ctxt->gid2 = lli2->lli_st_gid;
-                else
-                        ctxt->gid2 = -1;
-        } else 
-                ctxt->gid2 = 0;
-}
-
-
 typedef int (*intent_finish_cb)(struct ptlrpc_request *,
                                 struct inode *parent, struct pnode *pnode, 
                                 struct lookup_intent *, int offset, obd_id ino);
 int llu_intent_lock(struct inode *parent, struct pnode *pnode,
                     struct lookup_intent *, int flags, intent_finish_cb);
 
-/* FIXME */
-static inline int ll_permission(struct inode *inode, int flag, void * unused)
-{
-        return 0;
-}
-
 static inline __u64 ll_file_maxbytes(struct inode *inode)
 {
         return llu_i2info(inode)->lli_maxbytes;
@@ -251,13 +194,15 @@ struct mount_option_s
         char *osc_uuid;
 };
 
+#define IS_BAD_PTR(ptr)         \
+        ((unsigned long)(ptr) == 0 || (unsigned long)(ptr) > -1000UL)
+
 /* llite_lib.c */
 void generate_random_uuid(unsigned char uuid_out[16]);
 int liblustre_process_log(struct config_llog_instance *cfg, int allow_recov);
 int ll_parse_mount_target(const char *target, char **mdsnid,
                           char **mdsname, char **profile);
 
-extern int     g_zconf;
 extern char   *g_zconf_mdsnid;
 extern char   *g_zconf_mdsname;
 extern char   *g_zconf_profile;
@@ -271,6 +216,7 @@ void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid);
 int ll_it_open_error(int phase, struct lookup_intent *it);
 struct inode *llu_iget(struct filesys *fs, struct lustre_md *md);
 int llu_inode_getattr(struct inode *inode, struct lov_stripe_md *lsm);
+int llu_setattr_raw(struct inode *inode, struct iattr *attr);
 
 extern struct fssw_ops llu_fssw_ops;
 
@@ -285,21 +231,16 @@ int llu_create(struct inode *dir, struct pnode_base *pnode, int mode);
 int llu_iop_open(struct pnode *pnode, int flags, mode_t mode);
 int llu_mdc_close(struct obd_export *mdc_exp, struct inode *inode);
 int llu_iop_close(struct inode *inode);
-int llu_iop_ipreadv(struct inode *ino, struct ioctx *ioctxp);
-int llu_iop_ipwritev(struct inode *ino, struct ioctx *ioctxp);
+_SYSIO_OFF_T llu_iop_pos(struct inode *ino, _SYSIO_OFF_T off);
 int llu_vmtruncate(struct inode * inode, loff_t offset);
 void obdo_refresh_inode(struct inode *dst, struct obdo *src, obd_flag valid);
 int llu_objects_destroy(struct ptlrpc_request *request, struct inode *dir);
 
 /* rw.c */
-int llu_iop_iodone(struct ioctx *ioctxp __IS_UNUSED);
-struct llu_sysio_callback_args*
-llu_file_write(struct inode *inode, const struct iovec *iovec,
-        	       size_t iovlen, loff_t pos);
-struct llu_sysio_callback_args*
-llu_file_read(struct inode *inode, const struct iovec *iovec,
-              size_t iovlen, loff_t pos);
-int llu_glimpse_size(struct inode *inode, struct ost_lvb *lvb);
+int llu_iop_read(struct inode *ino, struct ioctx *ioctxp);
+int llu_iop_write(struct inode *ino, struct ioctx *ioctxp);
+int llu_iop_iodone(struct ioctx *ioctxp);
+int llu_glimpse_size(struct inode *inode);
 int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
                     struct lov_stripe_md *lsm, int mode,
                     ldlm_policy_data_t *policy, struct lustre_handle *lockh,
diff --git a/lustre/liblustre/lutil.c b/lustre/liblustre/lutil.c
new file mode 100644
index 0000000000..248cc333a8
--- /dev/null
+++ b/lustre/liblustre/lutil.c
@@ -0,0 +1,353 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (c) 2004 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <signal.h>
+#include <sys/types.h>
+
+#ifndef REDSTORM
+#include <fcntl.h>
+#include <netdb.h>
+#include <syscall.h>
+#include <sys/utsname.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#else
+#include <sys/socket.h>
+#include <catamount/data.h>
+#endif
+
+#include "lutil.h"
+
+#ifdef CRAY_PORTALS
+void portals_debug_dumplog(void){};
+#endif
+
+unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
+                                            S_GMNAL | S_OPENIBNAL);
+unsigned int portal_debug = 0;
+
+struct task_struct     *current;
+ptl_handle_ni_t         tcpnal_ni;
+ptl_nid_t               tcpnal_mynid;
+
+void *inter_module_get(char *arg)
+{
+        if (!strcmp(arg, "tcpnal_ni"))
+                return &tcpnal_ni;
+        else if (!strcmp(arg, "ldlm_cli_cancel_unused"))
+                return ldlm_cli_cancel_unused;
+        else if (!strcmp(arg, "ldlm_namespace_cleanup"))
+                return ldlm_namespace_cleanup;
+        else if (!strcmp(arg, "ldlm_replay_locks"))
+                return ldlm_replay_locks;
+        else
+                return NULL;
+}
+
+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){
+#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:
+                snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u",
+                         (__u32)(nid >> 32), (__u32)nid);
+                break;
+#endif
+        default:
+                snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
+                         nal, (long long)nid);
+                break;
+        }
+        return 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:
+                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 );
+                break;
+        }
+        return str;
+}
+
+#ifndef REDSTORM
+/*
+ * random number generator stuff
+ */
+static int _rand_dev_fd = -1;
+
+static int get_ipv4_addr()
+{
+        struct utsname myname;
+        struct hostent *hptr;
+        int ip;
+
+        if (uname(&myname) < 0)
+                return 0;
+
+        hptr = gethostbyname(myname.nodename);
+        if (hptr == NULL ||
+            hptr->h_addrtype != AF_INET ||
+            *hptr->h_addr_list == NULL) {
+                printf("LibLustre: Warning: fail to get local IPv4 address\n");
+                return 0;
+        }
+
+        ip = ntohl(*((int *) *hptr->h_addr_list));
+
+        return ip;
+}
+
+void liblustre_init_random()
+{
+        int seed;
+        struct timeval tv;
+
+        _rand_dev_fd = syscall(SYS_open, "/dev/urandom", O_RDONLY);
+        if (_rand_dev_fd >= 0) {
+                if (syscall(SYS_read, _rand_dev_fd, &seed, sizeof(int)) ==
+                    sizeof(int)) {
+                        srand(seed);
+                        return;
+                }
+                syscall(SYS_close, _rand_dev_fd);
+                _rand_dev_fd = -1;
+        }
+
+        gettimeofday(&tv, NULL);
+        srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(get_ipv4_addr()));
+}
+
+void get_random_bytes(void *buf, int size)
+{
+        char *p = buf;
+        LASSERT(size >= 0);
+
+        if (_rand_dev_fd >= 0) {
+                if (syscall(SYS_read, _rand_dev_fd, buf, size) == size)
+                        return;
+                syscall(SYS_close, _rand_dev_fd);
+                _rand_dev_fd = -1;
+        }
+
+        while (size--) 
+                *p++ = rand();
+}
+
+static void init_capability(int *res)
+{
+        cap_t syscap;
+        cap_flag_value_t capval;
+        int i;
+
+        *res = 0;
+
+        syscap = cap_get_proc();
+        if (!syscap) {
+                printf("Liblustre: Warning: failed to get system capability, "
+                       "set to minimal\n");
+                return;
+        }
+
+        for (i = 0; i < sizeof(cap_value_t) * 8; i++) {
+                if (!cap_get_flag(syscap, i, CAP_EFFECTIVE, &capval)) {
+                        if (capval == CAP_SET) {
+                                *res |= 1 << i;
+                        }
+                }
+        }
+}
+
+void liblustre_set_nal_nid()
+{
+        pid_t pid;
+        uint32_t ip;
+        struct in_addr in;
+
+        /* need to setup mynid before tcpnal initialization */
+        /* a meaningful nid could help debugging */
+        ip = get_ipv4_addr();
+        if (ip == 0)
+                get_random_bytes(&ip, sizeof(ip));
+        pid = getpid() & 0xffffffff;
+        tcpnal_mynid = ((uint64_t)ip << 32) | pid;
+
+        in.s_addr = htonl(ip);
+        printf("LibLustre: TCPNAL NID: %016llx (%s:%u)\n", 
+               tcpnal_mynid, inet_ntoa(in), pid);
+}
+
+#else /* REDSTORM */
+
+void liblustre_init_random()
+{
+        struct timeval tv;
+        UINT32 nodeid;
+
+        gettimeofday(&tv, NULL);
+        nodeid = _my_pnid;
+        srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(nodeid));
+}
+
+void get_random_bytes(void *buf, int size)
+{
+        char *p = buf;
+        LASSERT(size >= 0);
+
+        while (size--) 
+                *p++ = rand();
+}
+
+static void init_capability(int *res)
+{
+        *res = 0;
+}
+
+void liblustre_set_nal_nid()
+{
+        pid_t pid;
+        uint32_t ip;
+
+        ip = _my_pnid;
+        if (ip & 0xFF)
+                ip <<= 8;
+        pid = getpid() & 0xFF;
+        tcpnal_mynid = ip | pid;
+        printf("LibLustre: NAL NID: %08x (%u)\n", 
+               tcpnal_mynid, pid);
+}
+
+#endif /* REDSOTRM */
+
+int in_group_p(gid_t gid)
+{
+        int i;
+
+        if (gid == current->fsgid)
+                return 1;
+
+        for (i = 0; i < current->ngroups; i++) {
+                if (gid == current->groups[i])
+                        return 1;
+        }
+
+        return 0;
+}
+
+int liblustre_init_current(char *comm)
+{
+        current = malloc(sizeof(*current));
+        if (!current) {
+                CERROR("Not enough memory\n");
+                return -ENOMEM;
+        }
+        current->fs = &current->__fs;
+        current->fs->umask = umask(0777);
+        umask(current->fs->umask);
+
+        strncpy(current->comm, comm, sizeof(current->comm));
+        current->pid = getpid();
+        current->fsuid = geteuid();
+        current->fsgid = getegid();
+        memset(&current->pending, 0, sizeof(current->pending));
+
+        current->max_groups = sysconf(_SC_NGROUPS_MAX);
+        current->groups = malloc(sizeof(gid_t) * current->max_groups);
+        if (!current->groups) {
+                CERROR("Not enough memory\n");
+                return -ENOMEM;
+        }
+        current->ngroups = getgroups(current->max_groups, current->groups);
+        if (current->ngroups < 0) {
+                perror("Error getgroups");
+                return -EINVAL;
+        }
+
+        init_capability(&current->cap_effective);
+
+        return 0;
+}
+
+void generate_random_uuid(unsigned char uuid_out[16])
+{
+        get_random_bytes(uuid_out, sizeof(uuid_out));
+}
+
+int init_lib_portals()
+{
+        int max_interfaces;
+        int rc;
+        ENTRY;
+
+        rc = PtlInit(&max_interfaces);
+        if (rc != PTL_OK) {
+                CERROR("PtlInit failed: %d\n", rc);
+                RETURN (-ENXIO);
+        }
+        RETURN(0);
+}
+
+extern void ptlrpc_exit_portals(void);
+void cleanup_lib_portals()
+{
+        ptlrpc_exit_portals();
+}
+
+int
+libcfs_nal_cmd(struct portals_cfg *pcfg)
+{
+        /* handle portals command if we want */
+        return 0;
+}
diff --git a/lustre/liblustre/lutil.h b/lustre/liblustre/lutil.h
new file mode 100644
index 0000000000..dc67a23c94
--- /dev/null
+++ b/lustre/liblustre/lutil.h
@@ -0,0 +1,35 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (c) 2004 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __LUTIL_H_
+#define __LUTIL_H_
+
+#include <liblustre.h>
+#include <linux/obd.h>
+#include <linux/obd_class.h>
+
+void liblustre_init_random(void);
+int liblustre_init_current(char *comm);
+void liblustre_set_nal_nid(void);
+int init_lib_portals(void);
+void cleanup_lib_portals(void);
+
+#endif
diff --git a/lustre/liblustre/namei.c b/lustre/liblustre/namei.c
index 8d217ff907..2a7c5e01d2 100644
--- a/lustre/liblustre/namei.c
+++ b/lustre/liblustre/namei.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light name resolution
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -70,6 +70,7 @@ static void ll_intent_release(struct lookup_intent *it)
         EXIT;
 }
 
+#if 0
 /*
  * remove the stale inode from pnode
  */
@@ -94,6 +95,7 @@ void unhook_stale_inode(struct pnode *pno)
         EXIT;
         return;
 }
+#endif
 
 void llu_lookup_finish_locks(struct lookup_intent *it, struct pnode *pnode)
 {
@@ -230,17 +232,6 @@ int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
                 RETURN(0);
         }
 
-        /* check stale inode */
-        if (llu_i2info(pb->pb_ino)->lli_stale_flag)
-                unhook_stale_inode(pnode);
-
-        /* check again because unhook_stale_inode() might generate
-         * negative pnode */
-        if (pb->pb_ino == NULL) {
-                CDEBUG(D_INODE, "negative pb\n");
-                RETURN(0);
-        }
-
         /* This is due to bad interaction with libsysio. remove this when we
          * switched to libbsdio XXX
          */
@@ -303,7 +294,6 @@ int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
                 pb->pb_ino = NULL;
         } else {
                 llu_lookup_finish_locks(it, pnode);
-                llu_i2info(pb->pb_ino)->lli_stale_flag = 0;
         }
         RETURN(rc);
 }
@@ -318,15 +308,34 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
         struct inode *inode = NULL;
         int rc;
 
+        /* libsysio require us generate inode right away if success.
+         * so if mds created new inode for us we need make sure it
+         * succeeded. thus for any error we can't delay to the
+         * llu_file_open() time. */
+        if (it_disposition(it, DISP_OPEN_CREATE) &&
+            it_open_error(DISP_OPEN_CREATE, it)) {
+                CDEBUG(D_INODE, "detect mds create error\n");
+                return it_open_error(DISP_OPEN_CREATE, it);
+        }
+        if (it_disposition(it, DISP_OPEN_OPEN) &&
+            it_open_error(DISP_OPEN_OPEN, it)) {
+                CDEBUG(D_INODE, "detect mds open error\n");
+                /* undo which did by mdc_intent_lock */
+                if (it_disposition(it, DISP_OPEN_CREATE) &&
+                    !it_open_error(DISP_OPEN_CREATE, it)) {
+                        LASSERT(request);
+                        LASSERT(atomic_read(&request->rq_refcount) > 1);
+                        CDEBUG(D_INODE, "dec a ref of req %p\n", request);
+                        ptlrpc_req_finished(request);
+                }
+                return it_open_error(DISP_OPEN_OPEN, it);
+        }
+
         /* NB 1 request reference will be taken away by ll_intent_lock()
          * when I return
          */
-        /* FIXME: for CREAT, libsysio require the inode must be generated here
-         * currently here we don't know the whether the create is successful
-         * or failed on mds. thus blinded return -EPERM in llu_iget(). need
-         * a fix later.
-         */
-        if ((it->it_op & IT_CREAT) || !it_disposition(it, DISP_LOOKUP_NEG)) {
+        if (!it_disposition(it, DISP_LOOKUP_NEG) ||
+            (it->it_op & IT_CREAT)) {
                 struct lustre_md md;
                 struct llu_inode_info *lli;
                 ENTRY;
@@ -353,7 +362,6 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
                 if (it->it_op == IT_GETATTR && S_ISREG(lli->lli_st_mode) &&
                     lli->lli_smd != NULL) {
                         struct lov_stripe_md *lsm = lli->lli_smd;
-                        struct ost_lvb lvb;
                         ldlm_error_t rc;
 
                         LASSERT(lsm->lsm_object_id != 0);
@@ -361,12 +369,11 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
                         /* bug 2334: drop MDS lock before acquiring OST lock */
                         ll_intent_drop_lock(it);
 
-                        rc = llu_glimpse_size(inode, &lvb);
+                        rc = llu_glimpse_size(inode);
                         if (rc) {
                                 I_RELE(inode);
                                 RETURN(rc);
                         }
-                        lli->lli_st_size = lvb.lvb_size;
                 }
         } else {
                 ENTRY;
@@ -530,6 +537,8 @@ int llu_iop_lookup(struct pnode *pnode,
         int rc;
         ENTRY;
 
+        liblustre_wait_event(0);
+
         *inop = NULL;
 
         /* the mount root inode have no name, so don't call
@@ -563,4 +572,3 @@ int llu_iop_lookup(struct pnode *pnode,
 
         RETURN(rc);
 }
-
diff --git a/lustre/liblustre/rw.c b/lustre/liblustre/rw.c
index 9fe16e59f1..8c4c686470 100644
--- a/lustre/liblustre/rw.c
+++ b/lustre/liblustre/rw.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light block IO
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -30,7 +30,9 @@
 #include <sys/types.h>
 #include <sys/queue.h>
 #include <fcntl.h>
+#include <sys/uio.h>
 
+#include <xtio.h>
 #include <sysio.h>
 #include <fs.h>
 #include <mount.h>
@@ -41,6 +43,38 @@
 
 #include "llite_lib.h"
 
+struct llu_io_group
+{
+        struct obd_io_group    *lig_oig;
+        struct inode           *lig_inode;
+        int                     lig_maxpages;
+        int                     lig_npages;
+        __u64                   lig_rwcount;
+        struct ll_async_page   *lig_llap;
+        struct page            *lig_pages;
+};
+
+#define LLU_IO_GROUP_SIZE(x) \
+        (sizeof(struct llu_io_group) + \
+         sizeof(struct ll_async_page) * (x) + \
+         sizeof(struct page) * (x))
+
+struct llu_io_session
+{
+        struct inode           *lis_inode;
+        int                     lis_cmd;
+        int                     lis_max_groups;
+        int                     lis_ngroups;
+        struct llu_io_group    *lis_groups[0];
+};
+#define LLU_IO_SESSION_SIZE(x)  \
+        (sizeof(struct llu_io_session) + (x) * 2 * sizeof(void *))
+
+
+typedef ssize_t llu_file_piov_t(const struct iovec *iovec, int iovlen,
+                                _SYSIO_OFF_T pos, ssize_t len,
+                                void *private);
+
 static int llu_lock_to_stripe_offset(struct inode *inode, struct ldlm_lock *lock)
 {
         struct llu_inode_info *lli = llu_i2info(inode);
@@ -110,8 +144,10 @@ static int llu_extent_lock_callback(struct ldlm_lock *lock,
                 lsm = lli->lli_smd;
 
                 stripe = llu_lock_to_stripe_offset(inode, lock);
+                l_lock(&lock->l_resource->lr_namespace->ns_lock);
                 kms = ldlm_extent_shift_kms(lock,
                                             lsm->lsm_oinfo[stripe].loi_kms);
+                l_unlock(&lock->l_resource->lr_namespace->ns_lock);
                 if (lsm->lsm_oinfo[stripe].loi_kms != kms)
                         LDLM_DEBUG(lock, "updating kms from "LPU64" to "LPU64,
                                    lsm->lsm_oinfo[stripe].loi_kms, kms);
@@ -171,12 +207,13 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         return rc;
 }
 
-__u64 lov_merge_size(struct lov_stripe_md *lsm, int kms);
+__u64 lov_merge_size(struct lov_stripe_md *lsm, int kms_only);
+__u64 lov_merge_blocks(struct lov_stripe_md *lsm);
 __u64 lov_merge_mtime(struct lov_stripe_md *lsm, __u64 current_time);
 
 /* NB: lov_merge_size will prefer locally cached writes if they extend the
  * file (because it prefers KMS over RSS when larger) */
-int llu_glimpse_size(struct inode *inode, struct ost_lvb *lvb)
+int llu_glimpse_size(struct inode *inode)
 {
         struct llu_inode_info *lli = llu_i2info(inode);
         struct llu_sb_info *sbi = llu_i2sbi(inode);
@@ -190,14 +227,18 @@ int llu_glimpse_size(struct inode *inode, struct ost_lvb *lvb)
         rc = obd_enqueue(sbi->ll_osc_exp, lli->lli_smd, LDLM_EXTENT, &policy,
                          LCK_PR, &flags, llu_extent_lock_callback,
                          ldlm_completion_ast, llu_glimpse_callback, inode,
-                         sizeof(*lvb), lustre_swab_ost_lvb, &lockh);
-        if (rc > 0)
-                RETURN(-EIO);
+                         sizeof(struct ost_lvb), lustre_swab_ost_lvb, &lockh);
+        if (rc) {
+                CERROR("obd_enqueue returned rc %d, returning -EIO\n", rc);
+                RETURN(rc > 0 ? -EIO : rc);
+        }
 
-        lvb->lvb_size = lov_merge_size(lli->lli_smd, 0);
-        //inode->i_mtime = lov_merge_mtime(lli->lli_smd, inode->i_mtime);
+        lli->lli_st_size = lov_merge_size(lli->lli_smd, 0);
+        lli->lli_st_blocks = lov_merge_blocks(lli->lli_smd);
+        //lli->lli_st_mtime = lov_merge_mtime(lli->lli_smd, inode->i_mtime);
 
-        CDEBUG(D_DLMTRACE, "glimpse: size: "LPU64"\n", lvb->lvb_size);
+        CDEBUG(D_DLMTRACE, "glimpse: size: %llu, blocks: %lu\n",
+               lli->lli_st_size, lli->lli_st_blocks);
 
         obd_cancel(sbi->ll_osc_exp, lli->lli_smd, LCK_PR, &lockh);
 
@@ -240,89 +281,6 @@ int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
         RETURN(rc);
 }
 
-#if 0
-int llu_extent_lock_no_validate(struct ll_file_data *fd,
-                                struct inode *inode,
-                                struct lov_stripe_md *lsm,
-                                int mode,
-                                struct ldlm_extent *extent,
-                                struct lustre_handle *lockh,
-                                int ast_flags)
-{
-        struct llu_sb_info *sbi = llu_i2sbi(inode);
-        struct llu_inode_info *lli = llu_i2info(inode);
-        int rc;
-        ENTRY;
-
-        LASSERT(lockh->cookie == 0);
-
-        /* XXX phil: can we do this?  won't it screw the file size up? */
-        if ((fd && (fd->fd_flags & LL_FILE_IGNORE_LOCK)) ||
-            (sbi->ll_flags & LL_SBI_NOLCK))
-                RETURN(0);
-
-        CDEBUG(D_DLMTRACE, "Locking inode %lu, start "LPU64" end "LPU64"\n",
-               lli->lli_st_ino, extent->start, extent->end);
-
-        rc = obd_enqueue(sbi->ll_osc_exp, lsm, NULL, LDLM_EXTENT, extent,
-                         sizeof(extent), mode, &ast_flags,
-                         llu_extent_lock_callback, inode, lockh);
-
-        RETURN(rc);
-}
-
-/*
- * this grabs a lock and manually implements behaviour that makes it look like
- * the OST is returning the file size with each lock acquisition.
- */
-int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
-                    struct lov_stripe_md *lsm, int mode,
-                    struct ldlm_extent *extent, struct lustre_handle *lockh,
-                    int nonblock)
-{
-        struct llu_inode_info *lli = llu_i2info(inode);
-        struct obd_export *exp = llu_i2obdexp(inode);
-        struct ldlm_extent size_lock;
-        struct lustre_handle match_lockh = {0};
-        int flags, rc, matched;
-        int astflags = nonblock ? LDLM_FL_BLOCK_NOWAIT : 0;
-        ENTRY;
-
-        rc = llu_extent_lock_no_validate(fd, inode, lsm, mode, extent,
-                                         lockh, astflags);
-        if (rc != ELDLM_OK)
-                RETURN(rc);
-
-        if (test_bit(LLI_F_HAVE_OST_SIZE_LOCK, &lli->lli_flags))
-                RETURN(0);
-
-        rc = llu_inode_getattr(inode, lsm);
-        if (rc) {
-                llu_extent_unlock(fd, inode, lsm, mode, lockh);
-                RETURN(rc);
-        }
-
-        size_lock.start = lli->lli_st_size;
-        size_lock.end = OBD_OBJECT_EOF;
-
-        /* XXX I bet we should be checking the lock ignore flags.. */
-        /* FIXME use LDLM_FL_TEST_LOCK instead */
-        flags = LDLM_FL_CBPENDING | LDLM_FL_BLOCK_GRANTED;
-        matched = obd_match(exp, lsm, LDLM_EXTENT, &size_lock,
-                            sizeof(size_lock), LCK_PR, &flags, inode,
-                            &match_lockh);
-
-        /* hey, alright, we hold a size lock that covers the size we
-         * just found, its not going to change for a while.. */
-        if (matched == 1) {
-                set_bit(LLI_F_HAVE_OST_SIZE_LOCK, &lli->lli_flags);
-                obd_cancel(exp, lsm, LCK_PR, &match_lockh);
-        }
-
-        RETURN(0);
-}
-#endif
-
 int llu_extent_unlock(struct ll_file_data *fd, struct inode *inode,
                 struct lov_stripe_md *lsm, int mode,
                 struct lustre_handle *lockh)
@@ -416,62 +374,15 @@ static struct obd_async_page_ops llu_async_page_ops = {
         .ap_completion =        llu_ap_completion,
 };
 
-static
-struct llu_sysio_cookie* get_sysio_cookie(struct inode *inode, int maxpages)
+static int llu_queue_pio(int cmd, struct llu_io_group *group,
+                         char *buf, size_t count, loff_t pos)
 {
-        struct llu_sysio_cookie *cookie;
-        int rc;
-
-        OBD_ALLOC(cookie, LLU_SYSIO_COOKIE_SIZE(maxpages));
-        if (cookie == NULL)
-                goto out;
-
-        I_REF(inode);
-        cookie->lsc_inode = inode;
-        cookie->lsc_maxpages = maxpages;
-        cookie->lsc_llap = (struct ll_async_page *)(cookie + 1);
-        cookie->lsc_pages = (struct page *) (cookie->lsc_llap + maxpages);
-
-        rc = oig_init(&cookie->lsc_oig);
-        if (rc) {
-                OBD_FREE(cookie, LLU_SYSIO_COOKIE_SIZE(maxpages));
-                cookie = NULL;
-        }
-
-out:
-        return cookie;
-}
-
-static
-void put_sysio_cookie(struct llu_sysio_cookie *cookie)
-{
-        struct lov_stripe_md *lsm = llu_i2info(cookie->lsc_inode)->lli_smd;
-        struct obd_export *exp = llu_i2obdexp(cookie->lsc_inode);
-        struct ll_async_page *llap = cookie->lsc_llap;
-        int i;
-
-        for (i = 0; i< cookie->lsc_maxpages; i++) {
-                if (llap[i].llap_cookie)
-                        obd_teardown_async_page(exp, lsm, NULL,
-                                                llap[i].llap_cookie);
-        }
-
-        I_RELE(cookie->lsc_inode);
-
-        oig_release(cookie->lsc_oig);
-        OBD_FREE(cookie, LLU_SYSIO_COOKIE_SIZE(cookie->lsc_maxpages));
-}
-
-static
-int llu_prep_async_io(struct llu_sysio_cookie *cookie, int cmd,
-                      char *buf, loff_t pos, size_t count)
-{
-        struct llu_inode_info *lli = llu_i2info(cookie->lsc_inode);
+        struct llu_inode_info *lli = llu_i2info(group->lig_inode);
         struct lov_stripe_md *lsm = lli->lli_smd;
-        struct obd_export *exp = llu_i2obdexp(cookie->lsc_inode);
-        struct page *pages = cookie->lsc_pages;
-        struct ll_async_page *llap = cookie->lsc_llap;
-        int i, rc, npages = 0;
+        struct obd_export *exp = llu_i2obdexp(group->lig_inode);
+        struct page *pages = &group->lig_pages[group->lig_npages];
+        struct ll_async_page *llap = &group->lig_llap[group->lig_npages];
+        int i, rc, npages = 0, ret_bytes = 0;
         ENTRY;
 
         if (!exp)
@@ -507,10 +418,11 @@ int llu_prep_async_io(struct llu_sysio_cookie *cookie, int cmd,
                 pos += bytes;
                 buf += bytes;
 
-                cookie->lsc_rwcount += bytes;
+                group->lig_rwcount += bytes;
+                ret_bytes += bytes;
         } while (count);
 
-        cookie->lsc_npages = npages;
+        group->lig_npages += npages;
 
         for (i = 0; i < npages; i++) {
                 llap[i].llap_magic = LLAP_MAGIC;
@@ -519,321 +431,352 @@ int llu_prep_async_io(struct llu_sysio_cookie *cookie, int cmd,
                                          &llu_async_page_ops,
                                          &llap[i], &llap[i].llap_cookie);
                 if (rc) {
+                        LASSERT(rc < 0);
                         llap[i].llap_cookie = NULL;
                         RETURN(rc);
                 }
-                CDEBUG(D_CACHE, "llap %p page %p cookie %p obj off "LPU64"\n",
+                CDEBUG(D_CACHE, "llap %p page %p group %p obj off "LPU64"\n",
                        &llap[i], &pages[i], llap[i].llap_cookie,
                        (obd_off)pages[i].index << PAGE_SHIFT);
                 pages[i].private = (unsigned long)&llap[i];
                 llap[i].llap_page = &pages[i];
-                llap[i].llap_inode = cookie->lsc_inode;
+                llap[i].llap_inode = group->lig_inode;
 
-                rc = obd_queue_group_io(exp, lsm, NULL, cookie->lsc_oig,
+                rc = obd_queue_group_io(exp, lsm, NULL, group->lig_oig,
                                         llap[i].llap_cookie, cmd,
                                         pages[i]._offset, pages[i]._count, 0,
                                         ASYNC_READY | ASYNC_URGENT |
                                         ASYNC_COUNT_STABLE | ASYNC_GROUP_SYNC);
-                if (rc)
+                if (rc) {
+                        LASSERT(rc < 0);
                         RETURN(rc);
+                }
 
                 llap[i].llap_queued = 1;
         }
 
-        RETURN(0);
+        RETURN(ret_bytes);
 }
 
 static
-int llu_start_async_io(struct llu_sysio_cookie *cookie)
+struct llu_io_group * get_io_group(struct inode *inode, int maxpages)
 {
-        struct lov_stripe_md *lsm = llu_i2info(cookie->lsc_inode)->lli_smd;
-        struct obd_export *exp = llu_i2obdexp(cookie->lsc_inode);
+        struct llu_io_group *group;
+        int rc;
 
-        return obd_trigger_group_io(exp, lsm, NULL, cookie->lsc_oig);
-}
+        OBD_ALLOC(group, LLU_IO_GROUP_SIZE(maxpages));
+        if (!group)
+                return ERR_PTR(-ENOMEM);
 
-/*
- * read/write a continuous buffer for an inode (zero-copy)
- */
-struct llu_sysio_cookie*
-llu_rw(int cmd, struct inode *inode, char *buf, size_t count, loff_t pos)
-{
-        struct llu_sysio_cookie *cookie;
-        int max_pages, rc;
-        ENTRY;
+        I_REF(inode);
+        group->lig_inode = inode;
+        group->lig_maxpages = maxpages;
+        group->lig_llap = (struct ll_async_page *)(group + 1);
+        group->lig_pages = (struct page *) (group->lig_llap + maxpages);
 
-        max_pages = (count >> PAGE_SHIFT) + 2;
+        rc = oig_init(&group->lig_oig);
+        if (rc) {
+                OBD_FREE(group, LLU_IO_GROUP_SIZE(maxpages));
+                return ERR_PTR(rc);
+        }
 
-        cookie = get_sysio_cookie(inode, max_pages);
-        if (!cookie)
-                RETURN(ERR_PTR(-ENOMEM));
+        return group;
+}
 
-        rc = llu_prep_async_io(cookie, cmd, buf, pos, count);
-        if (rc)
-                GOTO(out_cleanup, rc);
+static int max_io_pages(ssize_t len, int iovlen)
+{
+        return (((len + PAGE_SIZE -1) / PAGE_SIZE) + 2 + iovlen - 1);
+}
 
-        rc = llu_start_async_io(cookie);
-        if (rc)
-                GOTO(out_cleanup, rc);
+static
+void put_io_group(struct llu_io_group *group)
+{
+        struct lov_stripe_md *lsm = llu_i2info(group->lig_inode)->lli_smd;
+        struct obd_export *exp = llu_i2obdexp(group->lig_inode);
+        struct ll_async_page *llap = group->lig_llap;
+        int i;
 
-/*
-        rc = oig_wait(&oig);
-        if (rc) {
-                CERROR("file i/o error!\n");
-                rw_count = rc;
+        for (i = 0; i< group->lig_npages; i++) {
+                if (llap[i].llap_cookie)
+                        obd_teardown_async_page(exp, lsm, NULL,
+                                                llap[i].llap_cookie);
         }
-*/
-        RETURN(cookie);
 
-out_cleanup:
-        put_sysio_cookie(cookie);
-        RETURN(ERR_PTR(rc));
+        I_RELE(group->lig_inode);
+
+        oig_release(group->lig_oig);
+        OBD_FREE(group, LLU_IO_GROUP_SIZE(group->lig_maxpages));
 }
 
 void lov_increase_kms(struct obd_export *exp, struct lov_stripe_md *lsm,
                       obd_off size);
 
-struct llu_sysio_callback_args*
-llu_file_write(struct inode *inode, const struct iovec *iovec,
-               size_t iovlen, loff_t pos)
+static
+ssize_t llu_file_prwv(const struct iovec *iovec, int iovlen,
+                        _SYSIO_OFF_T pos, ssize_t len,
+                        void *private)
 {
+        struct llu_io_session *session = (struct llu_io_session *) private;
+        struct inode *inode = session->lis_inode;
         struct llu_inode_info *lli = llu_i2info(inode);
         struct ll_file_data *fd = lli->lli_file_data;
         struct lustre_handle lockh = {0};
         struct lov_stripe_md *lsm = lli->lli_smd;
         struct obd_export *exp = NULL;
         ldlm_policy_data_t policy;
-        struct llu_sysio_callback_args *lsca;
-        struct llu_sysio_cookie *cookie;
+        struct llu_io_group *iogroup;
         int astflag = (lli->lli_open_flags & O_NONBLOCK) ?
                        LDLM_FL_BLOCK_NOWAIT : 0;
-        ldlm_error_t err;
-        int iovidx;
+        __u64 kms;
+        int err, is_read, lock_mode, iovidx, ret;
         ENTRY;
 
-        /* XXX consider other types later */
-        if (!S_ISREG(lli->lli_st_mode))
-                LBUG();
-
-        LASSERT(iovlen <= MAX_IOVEC);
+        /* in a large iov read/write we'll be repeatedly called.
+         * so give a chance to answer cancel ast here
+         */
+        liblustre_wait_event(0);
 
         exp = llu_i2obdexp(inode);
         if (exp == NULL)
-                RETURN(ERR_PTR(-EINVAL));
+                RETURN(-EINVAL);
 
-        OBD_ALLOC(lsca, sizeof(*lsca));
-        if (!lsca)
-                RETURN(ERR_PTR(-ENOMEM));
+        if (len == 0 || iovlen == 0)
+                RETURN(0);
+
+        if (pos + len > lli->lli_maxbytes)
+                RETURN(-ERANGE);
+
+        iogroup = get_io_group(inode, max_io_pages(len, iovlen));
+        if (IS_ERR(iogroup))
+                RETURN(PTR_ERR(iogroup));
+
+        is_read = session->lis_cmd == OBD_BRW_READ;
+        lock_mode = is_read ? LCK_PR : LCK_PW;
+
+        if (!is_read && (lli->lli_open_flags & O_APPEND)) {
+                policy.l_extent.start = 0;
+                policy.l_extent.end = OBD_OBJECT_EOF;
+        } else {
+                policy.l_extent.start = pos;
+                policy.l_extent.end = pos + len - 1;
+        }
+
+        err = llu_extent_lock(fd, inode, lsm, lock_mode, &policy,
+                              &lockh, astflag);
+        if (err != ELDLM_OK)
+                GOTO(err_put, err);
+
+        if (is_read) {
+                kms = lov_merge_size(lsm, 1);
+                if (policy.l_extent.end > kms) {
+                        /* A glimpse is necessary to determine whether we
+                         * return a short read or some zeroes at the end of
+                         * the buffer */
+                        if ((err = llu_glimpse_size(inode))) {
+                                llu_extent_unlock(fd, inode, lsm,
+                                                  lock_mode, &lockh);
+                                GOTO(err_put, err);
+                        }
+                } else {
+                        lli->lli_st_size = kms;
+                }
+        } else {
+                if (lli->lli_open_flags & O_APPEND)
+                        pos = lli->lli_st_size;
+        }
 
-        /* FIXME optimize the following extent locking */
         for (iovidx = 0; iovidx < iovlen; iovidx++) {
-                char *buf = (char*)iovec[iovidx].iov_base;
+                char *buf = (char *) iovec[iovidx].iov_base;
                 size_t count = iovec[iovidx].iov_len;
 
-                if (count == 0)
+                if (!count)
                         continue;
+                if (len < count)
+                        count = len;
+                if (IS_BAD_PTR(buf) || IS_BAD_PTR(buf + count)) {
+                        llu_extent_unlock(fd, inode, lsm, lock_mode, &lockh);
+                        GOTO(err_put, err = -EFAULT);
+                }
 
-                if (pos + count > lli->lli_maxbytes)
-                        GOTO(err_out, err = -ERANGE);
-
-                /* FIXME libsysio haven't handle O_APPEND?? */
-                policy.l_extent.start = pos;
-                policy.l_extent.end = pos + count - 1;
-
-                err = llu_extent_lock(fd, inode, lsm, LCK_PW, &policy,
-                                      &lockh, astflag);
-                if (err != ELDLM_OK)
-                        GOTO(err_out, err = -ENOLCK);
-
-                CDEBUG(D_INFO, "Writing inode %lu, "LPSZ" bytes, offset %llu\n",
-                       lli->lli_st_ino, count, pos);
-
-                cookie = llu_rw(OBD_BRW_WRITE, inode, buf, count, pos);
-                if (!IS_ERR(cookie)) {
-                        /* save cookie */
-                        lsca->cookies[lsca->ncookies++] = cookie;
-                        pos += count;
-                        lov_increase_kms(exp, lsm, pos);
-                        /* file size grow */
-                        if (pos > lli->lli_st_size)
-                                lli->lli_st_size = pos;
+                if (is_read) {
+                        if (pos >= lli->lli_st_size)
+                                break;
                 } else {
-                        llu_extent_unlock(fd, inode, lsm, LCK_PW, &lockh);
-                        GOTO(err_out, err = PTR_ERR(cookie));
+                        if (pos >= lli->lli_maxbytes) {
+                                llu_extent_unlock(fd, inode, lsm, lock_mode,
+                                                  &lockh);
+                                GOTO(err_put, err = -EFBIG);
+                        }
+                        if (pos + count >= lli->lli_maxbytes)
+                                count = lli->lli_maxbytes - pos;
                 }
 
-                /* XXX errors? */
-                err = llu_extent_unlock(fd, inode, lsm, LCK_PW, &lockh);
-                if (err)
-                        CERROR("extent unlock error %d\n", err);
+                ret = llu_queue_pio(session->lis_cmd, iogroup, buf, count, pos);
+                if (ret < 0) {
+                        llu_extent_unlock(fd, inode, lsm, lock_mode, &lockh);
+                        GOTO(err_put, err = ret);
+                } else {
+                        pos += ret;
+                        if (!is_read) {
+                                LASSERT(ret == count);
+                                lov_increase_kms(exp, lsm, pos);
+                                /* file size grow immediately */
+                                if (pos > lli->lli_st_size)
+                                        lli->lli_st_size = pos;
+                        }
+                        len -= ret;
+                        if (!len)
+                                break;
+                }
         }
+        LASSERT(len == 0 || is_read); /* libsysio should guarantee this */
 
-        RETURN(lsca);
+        err = llu_extent_unlock(fd, inode, lsm, lock_mode, &lockh);
+        if (err)
+                CERROR("extent unlock error %d\n", err);
 
-err_out:
-        /* teardown all async stuff */
-        while (lsca->ncookies--) {
-                put_sysio_cookie(lsca->cookies[lsca->ncookies]);
-        }
-        OBD_FREE(lsca, sizeof(*lsca));
+        err = obd_trigger_group_io(exp, lsm, NULL, iogroup->lig_oig);
+        if (err)
+                GOTO(err_put, err);
 
-        RETURN(ERR_PTR(err));
+        session->lis_groups[session->lis_ngroups++] = iogroup;
+        RETURN(0);
+err_put:
+        put_io_group(iogroup);
+        RETURN((ssize_t)err);
 }
 
-#if 0
-static void llu_update_atime(struct inode *inode)
+static
+struct llu_io_session *get_io_session(struct inode *ino, int ngroups, int cmd)
 {
-        struct llu_inode_info *lli = llu_i2info(inode);
+        struct llu_io_session *session;
 
-#ifdef USE_ATIME
-        struct iattr attr;
+        OBD_ALLOC(session, LLU_IO_SESSION_SIZE(ngroups));
+        if (!session)
+                return NULL;
 
-        attr.ia_atime = LTIME_S(CURRENT_TIME);
-        attr.ia_valid = ATTR_ATIME;
+        I_REF(ino);
+        session->lis_inode = ino;
+        session->lis_max_groups = ngroups;
+        session->lis_cmd = cmd;
+        return session;
+}
+
+static void put_io_session(struct llu_io_session *session)
+{
+        int i;
 
-        if (lli->lli_st_atime == attr.ia_atime) return;
-        if (IS_RDONLY(inode)) return;
-        if (IS_NOATIME(inode)) return;
+        for (i = 0; i < session->lis_ngroups; i++) {
+                if (session->lis_groups[i]) {
+                        put_io_group(session->lis_groups[i]);
+                        session->lis_groups[i] = NULL;
+                }
+        }
 
-        /* ll_inode_setattr() sets inode->i_atime from attr.ia_atime */
-        llu_inode_setattr(inode, &attr, 0);
-#else
-        /* update atime, but don't explicitly write it out just this change */
-        inode->i_atime = CURRENT_TIME;
-#endif
+        I_RELE(session->lis_inode);
+        OBD_FREE(session, LLU_IO_SESSION_SIZE(session->lis_max_groups));
 }
-#endif
 
-struct llu_sysio_callback_args*
-llu_file_read(struct inode *inode, const struct iovec *iovec,
-              size_t iovlen, loff_t pos)
+static int llu_file_rwx(struct inode *ino,
+                        struct ioctx *ioctx,
+                        int read)
 {
-        struct llu_inode_info *lli = llu_i2info(inode);
-        struct ll_file_data *fd = lli->lli_file_data;
-        struct lov_stripe_md *lsm = lli->lli_smd;
-        struct lustre_handle lockh = { 0 };
-        ldlm_policy_data_t policy;
-        struct llu_sysio_callback_args *lsca;
-        struct llu_sysio_cookie *cookie;
-        int astflag = (lli->lli_open_flags & O_NONBLOCK) ?
-                       LDLM_FL_BLOCK_NOWAIT : 0;
-        __u64 kms;
-        int iovidx;
-
-        ldlm_error_t err;
+        struct llu_io_session *session;
+        ssize_t cc;
+        int cmd = read ? OBD_BRW_READ : OBD_BRW_WRITE;
         ENTRY;
 
-        OBD_ALLOC(lsca, sizeof(*lsca));
-        if (!lsca)
-                RETURN(ERR_PTR(-ENOMEM));
+        LASSERT(ioctx->ioctx_xtvlen >= 0);
+        LASSERT(ioctx->ioctx_iovlen >= 0);
 
-        for (iovidx = 0; iovidx < iovlen; iovidx++) {
-                char *buf = iovec[iovidx].iov_base;
-                size_t count = iovec[iovidx].iov_len;
+        liblustre_wait_event(0);
 
-                /* "If nbyte is 0, read() will return 0 and have no other results."
-                 *                      -- Single Unix Spec */
-                if (count == 0)
-                        continue;
+        if (!ioctx->ioctx_xtvlen)
+                RETURN(0);
 
-                policy.l_extent.start = pos;
-                policy.l_extent.end = pos + count - 1;
+        /* XXX consider other types later */
+        LASSERT(S_ISREG(llu_i2info(ino)->lli_st_mode));
 
-                err = llu_extent_lock(fd, inode, lsm, LCK_PR, &policy,
-                                      &lockh, astflag);
-                if (err != ELDLM_OK)
-                        GOTO(err_out, err = -ENOLCK);
+        session = get_io_session(ino, ioctx->ioctx_xtvlen * 2, cmd);
+        if (!session)
+                RETURN(-ENOMEM);
 
-                kms = lov_merge_size(lsm, 1);
-                if (policy.l_extent.end > kms) {
-                        /* A glimpse is necessary to determine whether we
-                         * return a short read or some zeroes at the end of
-                         * the buffer */
-                        struct ost_lvb lvb;
-                        if (llu_glimpse_size(inode, &lvb)) {
-                                llu_extent_unlock(fd, inode, lsm, LCK_PR, &lockh);
-                                GOTO(err_out, err = -ENOLCK);
-                        }
-                        lli->lli_st_size = lvb.lvb_size;
-                } else {
-                        lli->lli_st_size = kms;
-                }
+        cc = _sysio_enumerate_extents(ioctx->ioctx_xtv, ioctx->ioctx_xtvlen,
+                                      ioctx->ioctx_iov, ioctx->ioctx_iovlen,
+                                      llu_file_prwv, session);
 
-                CDEBUG(D_INFO, "Reading inode %lu, "LPSZ" bytes, offset %Ld, "
-                       "i_size "LPU64"\n", lli->lli_st_ino, count, pos,
-                       lli->lli_st_size);
+        if (cc >= 0) {
+                LASSERT(!ioctx->ioctx_cc);
+                ioctx->ioctx_private = session;
+                RETURN(0);
+        } else {
+                put_io_session(session);
+                RETURN(cc);
+        }
+}
 
-                if (pos >= lli->lli_st_size) {
-                        llu_extent_unlock(fd, inode, lsm, LCK_PR, &lockh);
-                        break;
-                }
+int llu_iop_read(struct inode *ino,
+                 struct ioctx *ioctx)
+{
+        return llu_file_rwx(ino, ioctx, 1);
+}
 
-                cookie = llu_rw(OBD_BRW_READ, inode, buf, count, pos);
-                if (!IS_ERR(cookie)) {
-                        /* save cookie */
-                        lsca->cookies[lsca->ncookies++] = cookie;
-                        pos += count;
-                } else {
-                        llu_extent_unlock(fd, inode, lsm, LCK_PR, &lockh);
-                        GOTO(err_out, err = PTR_ERR(cookie));
-                }
+int llu_iop_write(struct inode *ino,
+                  struct ioctx *ioctx)
+{
+        struct iattr iattr;
+        int rc;
 
-                /* XXX errors? */
-                err = llu_extent_unlock(fd, inode, lsm, LCK_PR, &lockh);
-                if (err)
-                        CERROR("extent_unlock fail: %d\n", err);
-        }
-#if 0
-        if (readed > 0)
-                llu_update_atime(inode);
-#endif
-        RETURN(lsca);
-
-err_out:
-        /* teardown all async stuff */
-        while (lsca->ncookies--) {
-                put_sysio_cookie(lsca->cookies[lsca->ncookies]);
+        memset(&iattr, 0, sizeof(iattr));
+        iattr.ia_mtime = iattr.ia_atime = CURRENT_TIME;
+        iattr.ia_valid = ATTR_MTIME | ATTR_ATIME | ATTR_RAW;
+
+        liblustre_wait_event(0);
+        rc = llu_setattr_raw(ino, &iattr);
+        if (rc) {
+                CERROR("failed to set mtime/atime during write: %d", rc);
+                /* XXX should continue or return error? */
         }
-        OBD_FREE(lsca, sizeof(*lsca));
 
-        RETURN(ERR_PTR(err));
+        return llu_file_rwx(ino, ioctx, 0);
 }
 
-int llu_iop_iodone(struct ioctx *ioctxp)
+int llu_iop_iodone(struct ioctx *ioctx)
 {
-        struct llu_sysio_callback_args *lsca = ioctxp->ioctx_private;
-        struct llu_sysio_cookie *cookie;
+        struct llu_io_session *session;
+        struct llu_io_group *group;
         int i, err = 0, rc = 0;
         ENTRY;
 
-        /* write/read(fd, buf, 0) */
-        if (!lsca) {
-                ioctxp->ioctx_cc = 0;
-                RETURN(1);
-        }
+        liblustre_wait_event(0);
 
-        LASSERT(!IS_ERR(lsca));
+        session = (struct llu_io_session *) ioctx->ioctx_private;
+        LASSERT(session);
+        LASSERT(!IS_ERR(session));
 
-        for (i = 0; i < lsca->ncookies; i++) {
-                cookie = lsca->cookies[i];
-                if (cookie) {
-                        err = oig_wait(cookie->lsc_oig);
-                        if (err && !rc)
-                                rc = err;
+        for (i = 0; i < session->lis_ngroups; i++) {
+                group = session->lis_groups[i];
+                if (group) {
+                        if (!rc) {
+                                err = oig_wait(group->lig_oig);
+                                if (err)
+                                        rc = err;
+                        }
                         if (!rc)
-                                ioctxp->ioctx_cc += cookie->lsc_rwcount;
-                        put_sysio_cookie(cookie);
+                                ioctx->ioctx_cc += group->lig_rwcount;
+                        put_io_group(group);
+                        session->lis_groups[i] = NULL;
                 }
         }
 
         if (rc) {
                 LASSERT(rc < 0);
-                ioctxp->ioctx_cc = -1;
-                ioctxp->ioctx_errno = -rc;
+                ioctx->ioctx_cc = -1;
+                ioctx->ioctx_errno = -rc;
         }
 
-        OBD_FREE(lsca, sizeof(*lsca));
-        ioctxp->ioctx_private = NULL;
+        put_io_session(session);
+        ioctx->ioctx_private = NULL;
 
         RETURN(1);
 }
diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c
index 0b6c96a54a..028c2c817f 100644
--- a/lustre/liblustre/super.c
+++ b/lustre/liblustre/super.c
@@ -3,7 +3,7 @@
  *
  * Lustre Light Super operations
  *
- *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
  *
  *   This file is part of Lustre, http://www.lustre.org.
  *
@@ -47,26 +47,69 @@
 
 #include "llite_lib.h"
 
+#ifndef MAY_EXEC
+#define MAY_EXEC        1
+#define MAY_WRITE       2
+#define MAY_READ        4
+#endif
+
+#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
+
+static int ll_permission(struct inode *inode, int mask)
+{
+        struct llu_inode_info *lli = llu_i2info(inode);
+        mode_t mode = lli->lli_st_mode;
+
+        if (current->fsuid == lli->lli_st_uid)
+                mode >>= 6;
+        else if (in_group_p(lli->lli_st_gid))
+                mode >>= 3;
+
+        if ((mode & mask & (MAY_READ|MAY_WRITE|MAY_EXEC)) == mask)
+                return 0;
+
+        if ((mask & (MAY_READ|MAY_WRITE)) ||
+            (lli->lli_st_mode & S_IXUGO))
+                if (capable(CAP_DAC_OVERRIDE))
+                        return 0;
+
+        if (mask == MAY_READ ||
+            (S_ISDIR(lli->lli_st_mode) && !(mask & MAY_WRITE))) {
+                if (capable(CAP_DAC_READ_SEARCH))
+                        return 0;
+        }
+
+        return -EACCES;
+}
+
 static void llu_fsop_gone(struct filesys *fs)
 {
         struct llu_sb_info *sbi = (struct llu_sb_info *) fs->fs_private;
         struct obd_device *obd = class_exp2obd(sbi->ll_mdc_exp);
-        struct ll_fid rootfid;
+        struct lustre_cfg lcfg;
+        int next = 0;
         ENTRY;
 
         list_del(&sbi->ll_conn_chain);
         obd_disconnect(sbi->ll_osc_exp, 0);
+        obd_disconnect(sbi->ll_mdc_exp, 0);
 
-        /* NULL request to force sync on the MDS, and get the last_committed
-         * value to flush remaining RPCs from the sending queue on client.
-         *
-         * XXX This should be an mdc_sync() call to sync the whole MDS fs,
-         *     which we can call for other reasons as well.
-         */
-        if (!obd->obd_no_recov)
-                mdc_getstatus(sbi->ll_mdc_exp, &rootfid);
+        while ((obd = class_devices_in_group(&sbi->ll_sb_uuid, &next)) != NULL)
+        {
+                int err;
 
-        obd_disconnect(sbi->ll_mdc_exp, 0);
+                LCFG_INIT(lcfg, LCFG_CLEANUP, obd->obd_name);
+                err = class_process_config(&lcfg);
+                if (err) {
+                        CERROR("cleanup failed: %s\n", obd->obd_name);
+                }
+
+                LCFG_INIT(lcfg, LCFG_DETACH, obd->obd_name);
+                err = class_process_config(&lcfg);
+                if (err) {
+                        CERROR("detach failed: %s\n", obd->obd_name);
+                }
+        }
 
         OBD_FREE(sbi, sizeof(*sbi));
 
@@ -142,7 +185,7 @@ void obdo_to_inode(struct inode *dst, struct obdo *src, obd_flag valid)
 
         if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
                 CDEBUG(D_INODE, "valid %x, cur time %lu/%lu, new %lu/%lu\n",
-                       src->o_valid,
+                       src->o_valid, 
                        LTIME_S(lli->lli_st_mtime), LTIME_S(lli->lli_st_ctime),
                        (long)src->o_mtime, (long)src->o_ctime);
 
@@ -182,7 +225,7 @@ void obdo_from_inode(struct obdo *dst, struct inode *src, obd_flag valid)
 
         if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
                 CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
-                       valid, LTIME_S(lli->lli_st_mtime),
+                       valid, LTIME_S(lli->lli_st_mtime), 
                        LTIME_S(lli->lli_st_ctime));
 
         if (valid & OBD_MD_FLATIME) {
@@ -273,7 +316,7 @@ int llu_inode_getattr(struct inode *inode, struct lov_stripe_md *lsm)
         if (rc)
                 RETURN(rc);
 
-        refresh_valid = OBD_MD_FLBLOCKS | OBD_MD_FLBLKSZ | OBD_MD_FLMTIME |
+        refresh_valid = OBD_MD_FLBLOCKS | OBD_MD_FLBLKSZ | OBD_MD_FLMTIME | 
                         OBD_MD_FLCTIME | OBD_MD_FLSIZE;
 
         /* We set this flag in commit write as we extend the file size.  When
@@ -289,7 +332,7 @@ int llu_inode_getattr(struct inode *inode, struct lov_stripe_md *lsm)
         if (test_bit(LLI_F_PREFER_EXTENDED_SIZE, &lli->lli_flags)) {
                 if (oa.o_size < lli->lli_st_size)
                         refresh_valid &= ~OBD_MD_FLSIZE;
-                else
+                else 
                         clear_bit(LLI_F_PREFER_EXTENDED_SIZE, &lli->lli_flags);
         }
 
@@ -403,8 +446,8 @@ static int llu_inode_revalidate(struct inode *inode)
                         CERROR("failure %d inode %lu\n", rc, lli->lli_st_ino);
                         RETURN(-abs(rc));
                 }
-                rc = mdc_req2lustre_md(sbi->ll_mdc_exp, req, 0, 
-                                       sbi->ll_osc_exp, &md);
+                rc = mdc_req2lustre_md(sbi->ll_mdc_exp, req, 0, sbi->ll_osc_exp, 
+                                       &md);
 
                 /* XXX Too paranoid? */
                 if (((md.body->valid ^ valid) & OBD_MD_FLEASIZE) &&
@@ -437,14 +480,7 @@ static int llu_inode_revalidate(struct inode *inode)
 
         /* ll_glimpse_size will prefer locally cached writes if they extend
          * the file */
-        {
-                struct ost_lvb lvb;
-                ldlm_error_t err;
-
-                err = llu_glimpse_size(inode, &lvb);
-                lli->lli_st_size = lvb.lvb_size;
-        }
-        RETURN(0);
+        RETURN(llu_glimpse_size(inode));
 }
 
 static void copy_stat_buf(struct inode *ino, struct intnl_stat *b)
@@ -473,6 +509,8 @@ static int llu_iop_getattr(struct pnode *pno,
         int rc;
         ENTRY;
 
+        liblustre_wait_event(0);
+
         if (!ino) {
                 LASSERT(pno);
                 LASSERT(pno->p_base->pb_ino);
@@ -542,6 +580,7 @@ void llu_iop_gone(struct inode *inode)
         struct llu_inode_info *lli = llu_i2info(inode);
         ENTRY;
 
+        liblustre_wait_event(0);
         llu_clear_inode(inode);
 
         OBD_FREE(lli, sizeof(*lli));
@@ -660,6 +699,10 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                         ptlrpc_req_finished(request);
                         RETURN(rc);
                 }
+
+                /* Won't invoke vmtruncate as we already cleared ATTR_SIZE,
+                 * but needed to set timestamps backwards on utime. */
+                inode_setattr(inode, attr);
                 llu_update_inode(inode, md.body, md.lsm);
                 ptlrpc_req_finished(request);
 
@@ -676,7 +719,7 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                         /* from sys_utime() */
                         if (!(ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET))) {
                                 if (current->fsuid != lli->lli_st_uid &&
-                                    (rc = ll_permission(inode, 0/*MAY_WRITE*/, NULL)) != 0)
+                                    (rc = ll_permission(inode, MAY_WRITE)) != 0)
                                         RETURN(rc);
                         } else {
 				/* from inode_change_ok() */
@@ -710,9 +753,6 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                 }
 
                 rc = llu_vmtruncate(inode, attr->ia_size);
-                if (rc == 0)
-                        set_bit(LLI_F_HAVE_OST_SIZE_LOCK,
-                                &llu_i2info(inode)->lli_flags);
 
                 /* unlock now as we don't mind others file lockers racing with
                  * the mds updates below? */
@@ -749,6 +789,11 @@ static int llu_iop_setattr(struct pnode *pno,
         struct iattr iattr;
         ENTRY;
 
+        liblustre_wait_event(0);
+
+        LASSERT(!(mask & ~(SETATTR_MTIME | SETATTR_ATIME | 
+                           SETATTR_UID | SETATTR_GID |
+                           SETATTR_LEN | SETATTR_MODE)));
         memset(&iattr, 0, sizeof(iattr));
 
         if (mask & SETATTR_MODE) {
@@ -841,7 +886,7 @@ static int llu_readlink_internal(struct inode *inode,
                 CERROR ("OBD_MD_LINKNAME not set on reply\n");
                 GOTO (failed, rc = -EPROTO);
         }
-
+        
         LASSERT (symlen != 0);
         if (body->eadatasize != symlen) {
                 CERROR ("inode %lu: symlink length %d not expected %d\n",
@@ -948,13 +993,18 @@ static int llu_iop_link_raw(struct pnode *old, struct pnode *new)
         LASSERT(src);
         LASSERT(dir);
 
+        liblustre_wait_event(0);
         llu_prepare_mdc_op_data(&op_data, src, dir, name, namelen, 0);
         rc = mdc_link(llu_i2sbi(src)->ll_mdc_exp, &op_data, &request);
         ptlrpc_req_finished(request);
+        liblustre_wait_event(0);
 
         RETURN(rc);
 }
 
+/*
+ * libsysio will clear the inode immediately after return
+ */
 static int llu_iop_unlink_raw(struct pnode *pno)
 {
         struct inode *dir = pno->p_base->pb_parent->pb_ino;
@@ -969,30 +1019,21 @@ static int llu_iop_unlink_raw(struct pnode *pno)
 
         LASSERT(target);
 
+        liblustre_wait_event(0);
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
         rc = mdc_unlink(llu_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
-        if (!rc) {
+        if (!rc)
                 rc = llu_objects_destroy(request, dir);
-
-                llu_i2info(target)->lli_stale_flag = 1;
-                unhook_stale_inode(pno);
-        }
-
         ptlrpc_req_finished(request);
+        liblustre_wait_event(0);
+
         RETURN(rc);
 }
 
-/* FIXME
- * following cases need to be considered later:
- * - rename an opened file/dir
- * - an opened file be removed in rename
- * - rename to remove and hardlink (?opened)
- */
 static int llu_iop_rename_raw(struct pnode *old, struct pnode *new)
 {
         struct inode *src = old->p_parent->p_base->pb_ino;
         struct inode *tgt = new->p_parent->p_base->pb_ino;
-        struct inode *tgtinode = new->p_base->pb_ino;
         const char *oldname = old->p_base->pb_name.name;
         int oldnamelen = old->p_base->pb_name.len;
         const char *newname = new->p_base->pb_name.name;
@@ -1011,11 +1052,6 @@ static int llu_iop_rename_raw(struct pnode *old, struct pnode *new)
                         &request);
         if (!rc) {
                 rc = llu_objects_destroy(request, src);
-
-                if (tgtinode) {
-                        llu_i2info(tgtinode)->lli_stale_flag = 1;
-                        unhook_stale_inode(new);
-                }
         }
 
         ptlrpc_req_finished(request);
@@ -1109,6 +1145,8 @@ static int llu_iop_statvfs(struct pnode *pno,
         int rc;
         ENTRY;
 
+        liblustre_wait_event(0);
+
 #ifndef __CYGWIN__
         LASSERT(pno->p_base->pb_ino);
         rc = llu_statfs(llu_i2sbi(pno->p_base->pb_ino), &fs);
@@ -1176,19 +1214,42 @@ static int llu_iop_rmdir_raw(struct pnode *pno)
         rc = mdc_unlink(llu_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
         ptlrpc_req_finished(request);
 
-        /* libsysio: remove the pnode right away */
-        if (!rc) {
-                llu_i2info(pno->p_base->pb_ino)->lli_stale_flag = 1;
-                unhook_stale_inode(pno);
-        }
-
         RETURN(rc);
 }
 
-static int llu_iop_fcntl(struct inode *ino, int cmd, va_list ap)
+#ifdef O_DIRECT
+#define FCNTL_FLMASK (O_APPEND|O_NONBLOCK|O_ASYNC|O_DIRECT)
+#else
+#define FCNTL_FLMASK (O_APPEND|O_NONBLOCK|O_ASYNC)
+#endif
+#define FCNTL_FLMASK_INVALID (O_NONBLOCK|O_ASYNC)
+
+static int llu_iop_fcntl(struct inode *ino, int cmd, va_list ap, int *rtn)
 {
-        CERROR("liblustre did not support fcntl\n");
-        return -ENOSYS;
+        struct llu_inode_info *lli = llu_i2info(ino);
+        long flags;
+
+        switch (cmd) {
+        case F_GETFL:
+                *rtn = lli->lli_open_flags;
+                return 0;
+        case F_SETFL:
+                flags = va_arg(ap, long);
+                flags &= FCNTL_FLMASK;
+                if (flags & FCNTL_FLMASK_INVALID) {
+                        CERROR("liblustre don't support O_NONBLOCK, O_ASYNC, "
+                               "and O_DIRECT on file descriptor\n");
+                        *rtn = -1;
+                        return EINVAL;
+                }
+                lli->lli_open_flags = (int) flags;
+                *rtn = 0;
+                return 0;
+        }
+
+        CERROR("unsupported fcntl cmd %x\n", cmd);
+        *rtn = -1;
+        return ENOSYS;
 }
 
 static int llu_get_grouplock(struct inode *inode, unsigned long arg)
@@ -1247,13 +1308,15 @@ static int llu_put_grouplock(struct inode *inode, unsigned long arg)
         memset(&fd->fd_cwlockh, 0, sizeof(fd->fd_cwlockh));
 
         RETURN(0);
-}
+}       
 
 static int llu_iop_ioctl(struct inode *ino, unsigned long int request,
                          va_list ap)
 {
         unsigned long arg;
 
+        liblustre_wait_event(0);
+
         switch (request) {
         case LL_IOC_GROUP_LOCK:
                 arg = va_arg(ap, unsigned long);
@@ -1272,11 +1335,13 @@ static int llu_iop_ioctl(struct inode *ino, unsigned long int request,
  */
 static int llu_iop_sync(struct inode *inode)
 {
+        liblustre_wait_event(0);
         return 0;
 }
 
 static int llu_iop_datasync(struct inode *inode)
 {
+        liblustre_wait_event(0);
         return 0;
 }
 
@@ -1294,8 +1359,8 @@ struct inode *llu_iget(struct filesys *fs, struct lustre_md *md)
         if ((md->body->valid &
              (OBD_MD_FLGENER | OBD_MD_FLID | OBD_MD_FLTYPE)) !=
             (OBD_MD_FLGENER | OBD_MD_FLID | OBD_MD_FLTYPE)) {
-                /* FIXME this is workaround for for open(O_CREAT),
-                 * see lookup_it_finish(). */
+                CERROR("bad md body valid mask 0x%x\n", md->body->valid);
+                LBUG();
                 return ERR_PTR(-EPERM);
         }
 
@@ -1308,10 +1373,11 @@ struct inode *llu_iget(struct filesys *fs, struct lustre_md *md)
         if (inode) {
                 struct llu_inode_info *lli = llu_i2info(inode);
 
-                if (lli->lli_stale_flag ||
+                if (inode->i_zombie ||
                     lli->lli_st_generation != md->body->generation) {
                         I_RELE(inode);
-                } else {
+                }
+                else {
                         llu_update_inode(inode, md->body, md->lsm);
                         return inode;
                 }
@@ -1320,7 +1386,7 @@ struct inode *llu_iget(struct filesys *fs, struct lustre_md *md)
         inode = llu_new_inode(fs, &fid);
         if (inode)
                 llu_update_inode(inode, md->body, md->lsm);
-
+        
         return inode;
 }
 
@@ -1346,9 +1412,10 @@ llu_fsswop_mount(const char *source,
         struct lustre_handle osc_conn = {0, };
         struct lustre_md md;
         class_uuid_t uuid;
+        struct config_llog_instance cfg;
         struct lustre_profile *lprof;
         char *osc = NULL, *mdc = NULL;
-        int err = -EINVAL;
+        int async = 1, err = -EINVAL;
 
         ENTRY;
 
@@ -1361,62 +1428,38 @@ llu_fsswop_mount(const char *source,
         generate_random_uuid(uuid);
         class_uuid_unparse(uuid, &sbi->ll_sb_uuid);
 
-        /* zeroconf */
-        if (g_zconf) {
-                struct config_llog_instance cfg;
-                int len;
-
-                if (!g_zconf_mdsname) {
-                        CERROR("no mds name\n");
-                        GOTO(out_free, err = -EINVAL);
-                }
-
-                /* generate a string unique to this super, let's try
-                 the address of the super itself.*/
-                len = (sizeof(sbi) * 2) + 1;
-                OBD_ALLOC(sbi->ll_instance, len);
-                if (sbi->ll_instance == NULL)
-                        GOTO(out_free, err = -ENOMEM);
-                sprintf(sbi->ll_instance, "%p", sbi);
-
-                cfg.cfg_instance = sbi->ll_instance;
-                cfg.cfg_uuid = sbi->ll_sb_uuid;
-                err = liblustre_process_log(&cfg, 1);
-                if (err < 0) {
-                        CERROR("Unable to process log: %s\n", g_zconf_profile);
-
-                        GOTO(out_free, err);
-
-                }
-
-                lprof = class_get_profile(g_zconf_profile);
-                if (lprof == NULL) {
-                        CERROR("No profile found: %s\n", g_zconf_profile);
-                        GOTO(out_free, err = -EINVAL);
-                }
-                if (osc)
-                        OBD_FREE(osc, strlen(osc) + 1);
-                OBD_ALLOC(osc, strlen(lprof->lp_osc) +
-                          strlen(sbi->ll_instance) + 2);
-                sprintf(osc, "%s-%s", lprof->lp_osc, sbi->ll_instance);
-
-                if (mdc)
-                        OBD_FREE(mdc, strlen(mdc) + 1);
-                OBD_ALLOC(mdc, strlen(lprof->lp_mdc) +
-                          strlen(sbi->ll_instance) + 2);
-                sprintf(mdc, "%s-%s", lprof->lp_mdc, sbi->ll_instance);
-        } else {
-                /* setup from dump_file */
-                if (list_empty(&lustre_profile_list)) {
-                        CERROR("no profile\n");
-                        GOTO(out_free, err = -EINVAL);
-                }
+        /* generate a string unique to this super, let's try
+         the address of the super itself.*/
+        OBD_ALLOC(sbi->ll_instance, sizeof(sbi) * 2 + 1);
+        if (sbi->ll_instance == NULL) 
+                GOTO(out_free, err = -ENOMEM);
+        sprintf(sbi->ll_instance, "%p", sbi);
+
+        /* retrive & parse config log */
+        cfg.cfg_instance = sbi->ll_instance;
+        cfg.cfg_uuid = sbi->ll_sb_uuid;
+        err = liblustre_process_log(&cfg, 1);
+        if (err < 0) {
+                CERROR("Unable to process log: %s\n", g_zconf_profile);
+                GOTO(out_free, err);
+        }
 
-                lprof = list_entry(lustre_profile_list.next,
-                                   struct lustre_profile, lp_list);
-                osc = lprof->lp_osc;
-                mdc = lprof->lp_mdc;
+        lprof = class_get_profile(g_zconf_profile);
+        if (lprof == NULL) {
+                CERROR("No profile found: %s\n", g_zconf_profile);
+                GOTO(out_free, err = -EINVAL);
         }
+        if (osc)
+                OBD_FREE(osc, strlen(osc) + 1);
+        OBD_ALLOC(osc, strlen(lprof->lp_osc) + 
+                  strlen(sbi->ll_instance) + 2);
+        sprintf(osc, "%s-%s", lprof->lp_osc, sbi->ll_instance);
+
+        if (mdc)
+                OBD_FREE(mdc, strlen(mdc) + 1);
+        OBD_ALLOC(mdc, strlen(lprof->lp_mdc) + 
+                  strlen(sbi->ll_instance) + 2);
+        sprintf(mdc, "%s-%s", lprof->lp_mdc, sbi->ll_instance);
 
         if (!osc) {
                 CERROR("no osc\n");
@@ -1438,15 +1481,15 @@ llu_fsswop_mount(const char *source,
                 CERROR("MDC %s: not setup or attached\n", mdc);
                 GOTO(out_free, err = -EINVAL);
         }
-
+        obd_set_info(obd->obd_self_export, strlen("async"), "async",
+                     sizeof(async), &async);
 #warning "FIXME ASAP!"
 #if 0
         if (mdc_init_ea_size(obd, osc))
                 GOTO(out_free, err = -EINVAL);
 #endif
-
         /* setup mdc */
-        err = obd_connect(&mdc_conn, obd, &sbi->ll_sb_uuid);
+        err = obd_connect(&mdc_conn, obd, &sbi->ll_sb_uuid, 0);
         if (err) {
                 CERROR("cannot connect to %s: rc = %d\n", mdc, err);
                 GOTO(out_free, err);
@@ -1467,8 +1510,10 @@ llu_fsswop_mount(const char *source,
                 CERROR("OSC %s: not setup or attached\n", osc);
                 GOTO(out_mdc, err = -EINVAL);
         }
+        obd_set_info(obd->obd_self_export, strlen("async"), "async",
+                     sizeof(async), &async);
 
-        err = obd_connect(&osc_conn, obd, &sbi->ll_sb_uuid);
+        err = obd_connect(&osc_conn, obd, &sbi->ll_sb_uuid, 0);
         if (err) {
                 CERROR("cannot connect to %s: rc = %d\n", osc, err);
                 GOTO(out_mdc, err);
@@ -1491,8 +1536,8 @@ llu_fsswop_mount(const char *source,
                 GOTO(out_osc, err);
         }
 
-        err = mdc_req2lustre_md(sbi->ll_mdc_exp, request, 0, 
-                                sbi->ll_osc_exp, &md);
+        err = mdc_req2lustre_md(sbi->ll_mdc_exp, request, 0, sbi->ll_osc_exp, 
+                                &md);
         if (err) {
                 CERROR("failed to understand root inode md: rc = %d\n",err);
                 GOTO(out_request, err);
@@ -1558,8 +1603,9 @@ static struct inode_ops llu_inode_ops = {
         inop_link:      llu_iop_link_raw,
         inop_unlink:    llu_iop_unlink_raw,
         inop_rename:    llu_iop_rename_raw,
-        inop_ipreadv:   llu_iop_ipreadv,
-        inop_ipwritev:  llu_iop_ipwritev,
+        inop_pos:       llu_iop_pos,
+        inop_read:      llu_iop_read,
+        inop_write:     llu_iop_write,
         inop_iodone:    llu_iop_iodone,
         inop_fcntl:     llu_iop_fcntl,
         inop_sync:      llu_iop_sync,
diff --git a/lustre/liblustre/tests/Makefile.am b/lustre/liblustre/tests/Makefile.am
index 278567eb73..f2e39bda27 100644
--- a/lustre/liblustre/tests/Makefile.am
+++ b/lustre/liblustre/tests/Makefile.am
@@ -4,45 +4,45 @@ AM_CPPFLAGS = -I$(SYSIO)/include -I/opt/lam/include $(LLCPPFLAGS) -I$(top_srcdir
 AM_CFLAGS = $(LLCFLAGS)
 LIBS = $(LIBEFENCE) $(LIBREADLINE)
 
-LLIB_EXEC= ../liblustre.a -lcap -lpthread
+LLIB_EXEC= $(top_builddir)/liblustre/liblustre.a -lcap -lpthread
 
 if LIBLUSTRE
 noinst_LIBRARIES = libtestcommon.a
 def_tests = echo_test sanity recovery_small replay_single replay_ost_single
 
 if MPITESTS
-bin_PROGRAMS = $(def_tests) test_lock_cancel
+noinst_PROGRAMS = $(def_tests) test_lock_cancel
 else
-bin_PROGRAMS = $(def_tests)
+noinst_PROGRAMS = $(def_tests)
 endif
 endif # LIBLUSTRE
 
 libtestcommon_a_SOURCES = test_common.c test_common.h
 
-echo_test_SOURCES = echo_test.c  ../../utils/parser.c ../../utils/obd.c ../../utils/lustre_cfg.c
+echo_test_SOURCES = echo_test.c  $(top_srcdir)/utils/parser.c $(top_srcdir)/utils/obd.c $(top_srcdir)/utils/lustre_cfg.c
 echo_test_CFLAGS = $(LL_CFLAGS)
-echo_test_LDADD = ../liblsupport.a $(LIBREADLINE) -lcap -lpthread 
+echo_test_LDADD = $(top_builddir)/liblustre/liblsupport.a $(LIBREADLINE) -lcap -lpthread 
 echo_test_DEPENDENCIES=$(top_builddir)/liblustre/liblsupport.a
 
 sanity_SOURCES = sanity.c
 sanity_CFLAGS = $(LL_CFLAGS)
-sanity_LDADD := ./libtestcommon.a $(LLIB_EXEC)
-sanity_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a ./libtestcommon.a
+sanity_LDADD := libtestcommon.a $(LLIB_EXEC)
+sanity_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a libtestcommon.a
 
 recovery_small_SOURCES = recovery_small.c
 recovery_small_CFLAGS = $(LL_CFLAGS)
-recovery_small_LDADD := ./libtestcommon.a $(LLIB_EXEC) 
-recovery_small_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a
+recovery_small_LDADD := libtestcommon.a $(LLIB_EXEC) 
+recovery_small_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a libtestcommon.a
 
 replay_single_SOURCES = replay_single.c
 replay_single_CFLAGS = $(LL_CFLAGS)
-replay_single_LDADD := ./libtestcommon.a $(LLIB_EXEC)
-replay_single_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a
+replay_single_LDADD := libtestcommon.a $(LLIB_EXEC)
+replay_single_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a libtestcommon.a
 
 replay_ost_single_SOURCES = replay_ost_single.c
 replay_ost_single_CFLAGS = $(LL_CFLAGS)
-replay_ost_single_LDADD := ./libtestcommon.a $(LLIB_EXEC)
-replay_ost_single_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a
+replay_ost_single_LDADD := libtestcommon.a $(LLIB_EXEC)
+replay_ost_single_DEPENDENCIES = $(top_builddir)/liblustre/liblustre.a libtestcommon.a
 
 if MPITESTS
 test_lock_cancel_SOURCES = test_lock_cancel.c
diff --git a/lustre/liblustre/tests/echo_test.c b/lustre/liblustre/tests/echo_test.c
index 13157cdb3b..3048af89b0 100644
--- a/lustre/liblustre/tests/echo_test.c
+++ b/lustre/liblustre/tests/echo_test.c
@@ -1,79 +1,36 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Lustre Light user test program
+ *
+ *  Copyright (c) 2002-2004 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-#include <stdio.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-
-#include <portals/ptlctl.h>	/* needed for parse_dump */
-
 
 #include <liblustre.h>
 #include <linux/obd.h>
 #include <linux/obd_class.h>
-#include <procbridge.h>
 
 #define LIBLUSTRE_TEST 1
 #include "../utils/lctl.c"
 
-struct ldlm_namespace;
-struct ldlm_res_id;
-struct obd_import;
+#include "../lutil.h"
 
-unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
-                                            S_GMNAL | S_IBNAL);
-
-void get_random_bytes(void *ptr, int size)
-{
-        char *p = ptr;
-
-        if (size < 1)
-                return;
-
-        while(size--)
-                *p++ = rand();
-}
-
-void *inter_module_get(char *arg)
-{
-        if (!strcmp(arg, "tcpnal_ni"))
-                return &tcpnal_ni;
-        else if (!strcmp(arg, "ldlm_cli_cancel_unused"))
-                return ldlm_cli_cancel_unused;
-        else if (!strcmp(arg, "ldlm_namespace_cleanup"))
-                return ldlm_namespace_cleanup;
-        else if (!strcmp(arg, "ldlm_replay_locks"))
-                return ldlm_replay_locks;
-        else
-                return NULL;
-}
-
-/* XXX move to proper place */
-char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
-{
-        switch(nal){
-        case TCPNAL:
-                /* userspace NAL */
-        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;
-        default:
-                snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
-                         nal, (long long)nid);
-                break;
-        }
-        return str;
-}
-
-ptl_handle_ni_t         tcpnal_ni;
+extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
 
 struct pingcli_args {
         ptl_nid_t mynid;
@@ -106,46 +63,7 @@ char *portals_id2str(int nal, ptl_process_id_t id, char *str)
         return str;
 }
 
-struct task_struct *current;
-
-int
-libcfs_nal_cmd(struct portals_cfg *pcfg)
-{
-        CERROR("empty function!!!\n");
-        return 0;
-}
-
-int in_group_p(gid_t gid)
-{
-        return 0;
-}
-
-int init_current(int argc, char **argv)
-{ 
-        current = malloc(sizeof(*current));
-        strncpy(current->comm, argv[0], sizeof(current->comm));
-        current->pid = getpid();
-	return 0;
-}
-
-ptl_nid_t tcpnal_mynid;
-
-int init_lib_portals()
-{
-	int max_interfaces;
-        int rc;
-
-        rc = PtlInit(&max_interfaces);
-        if (rc != 0) {
-                CERROR("ksocknal: PtlNIInit failed: error %d\n", rc);
-                RETURN (rc);
-        }
-        return rc;
-}
-
-extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
-
-int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
+static int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
 {
 	int   rc = -EINVAL;
 	
@@ -163,15 +81,6 @@ int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
 	return rc;
 }
 
-static void generate_random_uuid(unsigned char uuid_out[16])
-{
-        int *arr = (int*)uuid_out;
-        int i;
-
-        for (i = 0; i < sizeof(uuid_out)/sizeof(int); i++)
-                arr[i] = rand();
-}
-
 static char *echo_server_nid = NULL;
 static char *echo_server_ostname = "obd1";
 static char *osc_dev_name = "OSC_DEV_NAME";
@@ -343,15 +252,13 @@ int main(int argc, char **argv)
 		return 1;
 	}
 
-        srand(time(NULL));
-
-	tcpnal_mynid = rand();
-#if 1
 	portal_debug = 0;
 	portal_subsystem_debug = 0;
-#endif
 
-        if (init_current(argc, argv) ||
+        liblustre_init_random();
+        liblustre_set_nal_nid();
+
+        if (liblustre_init_current(argv[0]) ||
 	    init_obdclass() || init_lib_portals() ||
 	    ptlrpc_init() ||
 	    mdc_init() ||
diff --git a/lustre/liblustre/tests/recovery_small.c b/lustre/liblustre/tests/recovery_small.c
index baa4877727..6cd9ba4a8f 100644
--- a/lustre/liblustre/tests/recovery_small.c
+++ b/lustre/liblustre/tests/recovery_small.c
@@ -364,7 +364,7 @@ int main(int argc, char * argv[])
                 exit(-1);
         }
 
-        setenv(ENV_LUSTRE_TIMEOUT, "10", 1);
+        setenv(ENV_LUSTRE_TIMEOUT, "5", 1);
 
         __liblustre_setup_();
 
@@ -373,7 +373,9 @@ int main(int argc, char * argv[])
                 t2();
                 t3();
                 t4();
+#if 0
                 t5();
+#endif
                 t6();
                 t7();
 
diff --git a/lustre/liblustre/tests/replay_single.c b/lustre/liblustre/tests/replay_single.c
index 339400832b..235d3303b7 100644
--- a/lustre/liblustre/tests/replay_single.c
+++ b/lustre/liblustre/tests/replay_single.c
@@ -316,9 +316,9 @@ extern void __liblustre_cleanup_(void);
 void usage(const char *cmd)
 {
         printf("Usage: \t%s --target mdsnid:/mdsname/profile -s mds_hostname "
-                "-b \"barrier cmd\" -f \"failover cmd\" --ssh \"ssh_cmd\"\n", cmd);
+                "-b \"barrier cmd\" -f \"failover cmd\" [--rsh \"rsh_cmd\"]\n", cmd);
         printf("       \t%s --dumpfile dumpfile -s mds_hostname -b \"barrier cmd\" "
-                "-f \"failover cmd\" --ssh \"ssh_cmd\"\n", cmd);
+                "-f \"failover cmd\" [--rsh \"rsh_cmd\"]\n", cmd);
         exit(-1);
 }
 
diff --git a/lustre/liblustre/tests/sanity.c b/lustre/liblustre/tests/sanity.c
index cb42afed65..15d16a16d1 100644
--- a/lustre/liblustre/tests/sanity.c
+++ b/lustre/liblustre/tests/sanity.c
@@ -33,9 +33,8 @@
 #include <fcntl.h>
 #include <sys/queue.h>
 #include <signal.h>
-
-#include <sysio.h>
-#include <mount.h>
+#include <errno.h>
+#include <dirent.h>
 
 #include "test_common.h"
 
@@ -60,6 +59,8 @@
                 printf("-------------------\n");                        \
         } while (0)
 
+#define MAX_PATH_LENGTH 4096
+
 void t1()
 {
         char *path="/mnt/lustre/test_t1";
@@ -102,108 +103,6 @@ void t4()
         LEAVE();
 }
 
-#define PAGE_SIZE (4096)
-#define _npages (2048)
-
-#define MAX_PATH_LENGTH 4096
-
-static int _buffer[_npages][PAGE_SIZE/sizeof(int)];
-
-/* pos:   i/o start from
- * xfer:  npages per transfer
- */
-static void pages_io(int xfer, loff_t pos)
-{
-        char *path="/mnt/lustre/test_t5";
-        int check_sum[_npages] = {0,};
-        int fd, rc, i, j;
-
-        memset(_buffer, 0, sizeof(_buffer));
-
-        /* create sample data */
-        for (i = 0; i < _npages; i++) {
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        _buffer[i][j] = rand();
-                }
-        }
-
-        /* compute checksum */
-        for (i = 0; i < _npages; i++) {
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        check_sum[i] += _buffer[i][j];
-                }
-        }
-
-        t_touch(path);
-
-	fd = t_open(path);
-
-        /* write */
-	lseek(fd, pos, SEEK_SET);
-	for (i = 0; i < _npages; i += xfer) {
-		rc = write(fd, _buffer[i], PAGE_SIZE * xfer);
-                if (rc != PAGE_SIZE * xfer) {
-                        printf("write error %d (i = %d)\n", rc, i);
-                        exit(1);
-                }
-	}
-        printf("succefully write %d pages(%d per xfer)\n", _npages, xfer);
-        memset(_buffer, 0, sizeof(_buffer));
-
-        /* read */
-	lseek(fd, pos, SEEK_SET);
-	for (i = 0; i < _npages; i += xfer) {
-		rc = read(fd, _buffer[i], PAGE_SIZE * xfer);
-                if (rc != PAGE_SIZE * xfer) {
-                        printf("read error %d (i = %d)\n", rc, i);
-                        exit(1);
-                }
-	}
-        printf("succefully read %d pages(%d per xfer)\n", _npages, xfer);
-
-        /* compute checksum */
-        for (i = 0; i < _npages; i++) {
-                int sum = 0;
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        sum += _buffer[i][j];
-                }
-                if (sum != check_sum[i]) {
-                        printf("chunk %d checksum error: expected 0x%x, get 0x%x\n",
-                                i, check_sum[i], sum);
-                }
-        }
-        printf("checksum verified OK!\n");
-
-	t_close(fd);
-        t_unlink(path);
-}
-
-void t5()
-{
-        char text[256];
-        loff_t off_array[] = {1, 4, 17, 255, 258, 4095, 4097, 8191, 1024*1024*1024};
-        int np = 1, i;
-        loff_t offset = 0;
-
-        while (np <= _npages) {
-                sprintf(text, "pages_io: %d per transfer, offset %lld",
-                        np, offset);
-                ENTRY(text);
-                pages_io(np, offset);
-                LEAVE();
-                np += np;
-        }
-
-        for (i = 0; i < sizeof(off_array)/sizeof(loff_t); i++) {
-                offset = off_array[i];
-                sprintf(text, "pages_io: 16 per transfer, offset %lld",
-                        offset);
-                ENTRY(text);
-                pages_io(16, offset);
-                LEAVE();
-        }
-}
-
 void t6()
 {
         char *path="/mnt/lustre/test_t6";
@@ -221,11 +120,20 @@ void t6()
 void t7()
 {
         char *path="/mnt/lustre/test_t7";
+        int rc;
         ENTRY("mknod");
 
-        t_mknod(path, S_IFCHR | 0644, 5, 4);
-        t_check_stat(path, NULL);
-        t_unlink(path);
+        if (geteuid() != 0) {
+                rc = mknod(path, S_IFCHR | 0644, (5<<8 | 4));
+                if (rc != -1 || errno != EPERM) {
+                        printf("mknod shouldn't success: rc %d, errno %d\n",
+                                rc, errno);
+                }
+        } else {
+                t_mknod(path, S_IFCHR | 0644, 5, 4);
+                t_check_stat(path, NULL);
+                t_unlink(path);
+        }
         LEAVE();
 }
 
@@ -367,7 +275,9 @@ void t14()
         char buf[1024];
         const int nfiles = 256;
         char *prefix = "test14_filename_long_prefix_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA___";
-        int fd, i;
+	struct dirent64 *ent;
+        int fd, i, rc, pos, index;
+	loff_t base = 0;
         ENTRY(">1 block(4k) directory readdir");
 
         t_mkdir(dir);
@@ -377,7 +287,35 @@ void t14()
                 t_touch(name);
         }
         fd = t_opendir(dir);
-        t_ls(fd, buf, sizeof(buf));
+        printf("Listing...\n");
+        index = 0;
+	while ((rc = getdirentries64(fd, buf, 1024, &base)) > 0) {
+		pos = 0;
+		while (pos < rc) {
+                        char *item;
+
+			ent = (struct dirent64 *) ((char*) buf + pos);
+                        item = (char *) ent->d_name;
+                        if (!strcmp(item, ".") || !strcmp(item, ".."))
+                                goto iter;
+                        if (strstr(item, prefix) != item) {
+                                printf("found bad name %s\n", item);
+                                exit(-1);
+                        }
+			printf("[%03d]: %s\n",
+                                index++, item + strlen(prefix));
+iter:
+			pos += ent->d_reclen;
+		}
+	}
+	if (rc < 0) {
+		printf("getdents error %d\n", rc);
+                exit(-1);
+	}
+        if (index != nfiles) {
+                printf("get %d files != %d\n", index, nfiles);
+                exit(-1);
+        }
         t_close(fd);
         printf("Cleanup...\n");
         for (i = 0; i < nfiles; i++) {
@@ -402,6 +340,179 @@ void t15()
         LEAVE();
 }
 
+void t16()
+{
+        char *file = "/mnt/lustre/test_t16_file";
+        int fd;
+        ENTRY("small-write-read");
+
+        t_echo_create(file, "aaaaaaaaaaaaaaaaaaaaaa");
+        t_grep(file, "aaaaaaaaaaaaaaaaaaaaaa");
+        t_unlink(file);
+        LEAVE();
+}
+
+void t17()
+{
+        char *file = "/mnt/lustre/test_t17_file";
+        int fd;
+        ENTRY("open-unlink without close");
+
+        fd = open(file, O_WRONLY | O_CREAT, 0666);
+        if (fd < 0) {
+                printf("failed to create file: %s\n", strerror(errno));
+                exit(-1);
+        }
+        t_unlink(file);
+        LEAVE();
+}
+
+void t18()
+{
+        char *file = "/mnt/lustre/test_t18_file";
+        char buf[128];
+        int fd, i;
+        struct stat statbuf[3];
+        ENTRY("write should change mtime/atime");
+
+        for (i = 0; i < 3; i++) {
+                fd = open(file, O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
+                if (fd < 0) {
+                        printf("error open file: %s\n", strerror(errno));
+                        exit(-1);
+                }
+                if (write(fd, buf, sizeof(buf)) != sizeof(buf)) {
+                        printf("error write file\n");
+                        exit(-1);
+                }
+                close(fd);
+                if(stat(file, &statbuf[i]) != 0) {
+                        printf("Error stat\n");
+                        exit(1);
+                }
+                printf("mtime %ld, ctime %d\n",
+                        statbuf[i].st_atime, statbuf[i].st_mtime);
+                sleep(2);
+        }
+
+        for (i = 1; i < 3; i++) {
+                if ((statbuf[i].st_atime <= statbuf[i-1].st_atime) ||
+                    (statbuf[i].st_mtime <= statbuf[i-1].st_mtime)) {
+                        printf("time error\n");
+                        exit(-1);
+                }
+        }
+        t_unlink(file);
+}
+
+#define PAGE_SIZE (4096)
+#define _npages (2048)
+
+static int _buffer[_npages][PAGE_SIZE/sizeof(int)];
+
+/* pos:   i/o start from
+ * xfer:  npages per transfer
+ */
+static void pages_io(int xfer, loff_t pos)
+{
+        char *path="/mnt/lustre/test_t50";
+        int check_sum[_npages] = {0,};
+        int fd, rc, i, j;
+        struct timeval tw1, tw2, tr1, tr2;
+        double tw, tr;
+
+        memset(_buffer, 0, sizeof(_buffer));
+
+        /* create sample data */
+        for (i = 0; i < _npages; i++) {
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
+                        _buffer[i][j] = rand();
+                }
+        }
+
+        /* compute checksum */
+        for (i = 0; i < _npages; i++) {
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
+                        check_sum[i] += _buffer[i][j];
+                }
+        }
+
+        t_touch(path);
+
+	fd = t_open(path);
+
+        /* write */
+	lseek(fd, pos, SEEK_SET);
+        gettimeofday(&tw1, NULL);
+	for (i = 0; i < _npages; i += xfer) {
+		rc = write(fd, _buffer[i], PAGE_SIZE * xfer);
+                if (rc != PAGE_SIZE * xfer) {
+                        printf("write error %d (i = %d)\n", rc, i);
+                        exit(1);
+                }
+	}
+        gettimeofday(&tw2, NULL);
+
+        memset(_buffer, 0, sizeof(_buffer));
+
+        /* read */
+	lseek(fd, pos, SEEK_SET);
+        gettimeofday(&tr1, NULL);
+	for (i = 0; i < _npages; i += xfer) {
+		rc = read(fd, _buffer[i], PAGE_SIZE * xfer);
+                if (rc != PAGE_SIZE * xfer) {
+                        printf("read error %d (i = %d)\n", rc, i);
+                        exit(1);
+                }
+	}
+        gettimeofday(&tr2, NULL);
+
+        /* compute checksum */
+        for (i = 0; i < _npages; i++) {
+                int sum = 0;
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
+                        sum += _buffer[i][j];
+                }
+                if (sum != check_sum[i]) {
+                        printf("chunk %d checksum error: expected 0x%x, get 0x%x\n",
+                                i, check_sum[i], sum);
+                }
+        }
+
+	t_close(fd);
+        t_unlink(path);
+        tw = (tw2.tv_sec - tw1.tv_sec) * 1000000 + (tw2.tv_usec - tw1.tv_usec);
+        tr = (tr2.tv_sec - tr1.tv_sec) * 1000000 + (tr2.tv_usec - tr1.tv_usec);
+        printf(" (R:%.3fM/s, W:%.3fM/s)\n",
+                (_npages * PAGE_SIZE) / (tw / 1000000.0) / (1024 * 1024),
+                (_npages * PAGE_SIZE) / (tr / 1000000.0) / (1024 * 1024));
+}
+
+void t50()
+{
+        char text[256];
+        loff_t off_array[] = {1, 17, 255, 258, 4095, 4097, 8191, 1024*1024*1024*1024ULL};
+        int np = 1, i;
+        loff_t offset = 0;
+
+        ENTRY("4k aligned i/o sanity");
+        while (np <= _npages) {
+                printf("%3d per xfer(total %d)...\t", np, _npages);
+                pages_io(np, offset);
+                np += np;
+        }
+        LEAVE();
+
+        ENTRY("4k un-aligned i/o sanity");
+        for (i = 0; i < sizeof(off_array)/sizeof(loff_t); i++) {
+                offset = off_array[i];
+                printf("16 per xfer(total %d), offset %10lld...\t",
+                        _npages, offset);
+                pages_io(16, offset);
+        }
+        LEAVE();
+}
+
 extern void __liblustre_setup_(void);
 extern void __liblustre_cleanup_(void);
 
@@ -448,12 +559,10 @@ int main(int argc, char * const argv[])
 
         __liblustre_setup_();
 
-#ifndef __CYGWIN__
         t1();
         t2();
         t3();
         t4();
-        t5();
         t6();
         t7();
         t8();
@@ -464,7 +573,10 @@ int main(int argc, char * const argv[])
         t13();
         t14();
         t15();
-#endif
+        t16();
+        t17();
+        t18();
+        t50();
 
 	printf("liblustre is about shutdown\n");
         __liblustre_cleanup_();
diff --git a/lustre/llite/Makefile.in b/lustre/llite/Makefile.in
index 8170e1fd8b..4b786a30ad 100644
--- a/lustre/llite/Makefile.in
+++ b/lustre/llite/Makefile.in
@@ -1,5 +1,5 @@
 MODULES := llite
-llite-objs := dcache.o dir.o file.o llite_close.o llite_gns.o llite_lib.o llite_nfs.o rw.o lproc_llite.o namei.o special.o symlink.o
+llite-objs := dcache.o dir.o file.o llite_close.o llite_gns.o llite_lib.o llite_nfs.o rw.o lproc_llite.o namei.o special.o symlink.o llite_mmap.o
 
 ifeq ($(PATCHLEVEL),4)
 llite-objs += rw24.o super.o
@@ -7,4 +7,4 @@ else
 llite-objs += rw26.o super25.o
 endif
 
-@INCLUDE_RULES@
\ No newline at end of file
+@INCLUDE_RULES@
diff --git a/lustre/llite/Makefile.mk b/lustre/llite/Makefile.mk
index 166ca646fa..45fb344149 100644
--- a/lustre/llite/Makefile.mk
+++ b/lustre/llite/Makefile.mk
@@ -8,4 +8,4 @@ include $(src)/../portals/Kernelenv
 obj-y += llite.o
 llite-objs := llite_lib.o dcache.o super.o rw.o \
 	super25.o file.o dir.o symlink.o namei.o lproc_llite.o \
-	rw26.o llite_nfs.o llite_close.o llite_gns.o special.o
+	rw26.o llite_nfs.o llite_close.o llite_gns.o special.o llite_mmap.o
diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c
index 13867b6a57..1984bc0619 100644
--- a/lustre/llite/dcache.c
+++ b/lustre/llite/dcache.c
@@ -55,7 +55,7 @@ static int ll_ddelete(struct dentry *de)
         ENTRY;
         LASSERT(de);
         CDEBUG(D_DENTRY, "%s dentry %*s (%p, parent %p, inode %p) %s%s\n",
-               (de->d_flags & DCACHE_LUSTRE_INVALID ? "keeping" : "deleting"),
+               (de->d_flags & DCACHE_LUSTRE_INVALID ? "deleting" : "keeping"),
                de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
                d_unhashed(de) ? "" : "hashed,",
                list_empty(&de->d_subdirs) ? "" : "subdirs");
@@ -155,9 +155,8 @@ restart:
 
 extern struct dentry *ll_find_alias(struct inode *, struct dentry *);
 
-static int revalidate_it_finish(struct ptlrpc_request *request, 
-                                int offset, struct lookup_intent *it,
-                                struct dentry *de)
+int revalidate_it_finish(struct ptlrpc_request *request, int offset, 
+                         struct lookup_intent *it, struct dentry *de)
 {
         struct ll_sb_info *sbi;
         int rc = 0;
@@ -189,7 +188,7 @@ void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry)
         }
 
         /* drop lookup or getattr locks immediately */
-        if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR) {
+        if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR || it->it_op == IT_CHDIR) {
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
                 /* on 2.6 there are situation when several lookups and
                  * revalidations may be requested during single operation.
@@ -205,12 +204,10 @@ void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft)
 {
         struct lookup_intent *it = *itp;
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-        if (it && it->it_magic != INTENT_MAGIC) {
-                CERROR("WARNING: uninitialized intent\n");
-                LBUG();
+        if (it) {
+                LASSERTF(it->it_magic == INTENT_MAGIC, "bad intent magic: %x\n",
+                         it->it_magic);
         }
-        if (it && (it->it_op == IT_GETATTR || it->it_op == 0))
-                it->it_op = IT_LOOKUP;
 #endif
 
         if (!it || it->it_op == IT_GETXATTR)
@@ -451,7 +448,20 @@ static void ll_dentry_iput(struct dentry *dentry, struct inode *inode)
         iput(inode);
 }
 #else
-#error "implement ->d_iput() for 2.6"
+static void ll_dentry_iput(struct dentry *dentry, struct inode *inode)
+{
+        struct ll_sb_info *sbi = ll_i2sbi(inode);
+        struct ll_fid parent, child;
+
+        LASSERT(dentry->d_parent && dentry->d_parent->d_inode);
+        ll_inode2fid(&parent, dentry->d_parent->d_inode);
+        ll_inode2fid(&child, inode);
+        md_change_cbdata_name(sbi->ll_mdc_exp, &parent,
+                              (char *)dentry->d_name.name, 
+                              dentry->d_name.len, &child, 
+                              null_if_equal, inode);
+        iput(inode);
+}
 #endif
 
 struct dentry_operations ll_d_ops = {
diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c
index f43f4f447b..6ac70bef26 100644
--- a/lustre/llite/dir.c
+++ b/lustre/llite/dir.c
@@ -303,7 +303,7 @@ int ll_readdir(struct file * filp, void * dirent, filldir_t filldir)
         unsigned long n = pos >> PAGE_CACHE_SHIFT;
         unsigned long npages = dir_pages(inode);
         unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
-        unsigned char *types = NULL;
+        unsigned char *types = ext2_filetype_table;
         int need_revalidate = (filp->f_version != inode->i_version);
         int rc = 0;
         ENTRY;
@@ -314,8 +314,6 @@ int ll_readdir(struct file * filp, void * dirent, filldir_t filldir)
         if (pos > inode->i_size - EXT2_DIR_REC_LEN(1))
                 RETURN(0);
 
-        types = ext2_filetype_table;
-
         for ( ; n < npages; n++, offset = 0) {
                 char *kaddr, *limit;
                 ext2_dirent *de;
@@ -346,17 +344,16 @@ int ll_readdir(struct file * filp, void * dirent, filldir_t filldir)
                 for ( ;(char*)de <= limit; de = ext2_next_entry(de)) {
                         if (de->inode) {
                                 int over;
-                                unsigned char d_type = DT_UNKNOWN;
-                                
                                 
                                 rc = 0; /* no error if we return something */
-                                if (types && de->file_type < EXT2_FT_MAX)
-                                        d_type = types[de->file_type];
-
+                                
                                 offset = (char *)de - kaddr;
                                 over = filldir(dirent, de->name, de->name_len,
                                                (n<<PAGE_CACHE_SHIFT) | offset,
-                                               le32_to_cpu(de->inode), d_type);
+                                               le32_to_cpu(de->inode),
+                                               types[de->file_type &
+                                                     (EXT2_FT_MAX - 1)]);
+
                                 if (over) {
                                         ext2_put_page(page);
                                         GOTO(done, rc);
diff --git a/lustre/llite/file.c b/lustre/llite/file.c
index 0ac8d65428..117a08c0bc 100644
--- a/lustre/llite/file.c
+++ b/lustre/llite/file.c
@@ -160,7 +160,14 @@ int ll_local_open(struct file *file, struct lookup_intent *it)
         LASSERT (body != NULL);                 /* reply already checked out */
         LASSERT_REPSWABBED (req, 1);            /* and swabbed down */
 
-        LASSERT(!file->private_data);
+        LASSERTF(file->private_data == NULL, "file %*s/%*s ino %lu/%u (%o)\n",
+                 file->f_dentry->d_name.len, file->f_dentry->d_name.name,
+                 file->f_dentry->d_parent->d_name.len,
+                 file->f_dentry->d_parent->d_name.name,
+                 file->f_dentry->d_inode->i_ino,
+                 file->f_dentry->d_inode->i_generation,
+                 file->f_dentry->d_inode->i_mode);
+
 
         OBD_SLAB_ALLOC(fd, ll_file_data_slab, SLAB_KERNEL, sizeof *fd);
         /* We can't handle this well without reorganizing ll_file_open and
@@ -204,8 +211,8 @@ int ll_file_open(struct inode *inode, struct file *file)
         int rc = 0;
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
-               inode->i_generation, inode);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p), flags %o\n", inode->i_ino,
+               inode->i_generation, inode, file->f_flags);
 
         /* don't do anything for / */
         if (inode->i_sb->s_root == file->f_dentry)
@@ -221,13 +228,15 @@ int ll_file_open(struct inode *inode, struct file *file)
         }
 
         lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_OPEN);
+        /* mdc_intent_lock() didn't get a request ref if there was an open
+         * error, so don't do cleanup on the request here (bug 3430) */
         rc = it_open_error(DISP_OPEN_OPEN, it);
         if (rc)
-                GOTO(out, rc);
+                RETURN(rc);
 
         rc = ll_local_open(file, it);
-        if (rc)
-                LBUG();
+
+        LASSERTF(rc == 0, "rc = %d\n", rc);
 
         if (!S_ISREG(inode->i_mode))
                 GOTO(out, rc);
@@ -270,7 +279,6 @@ int ll_lsm_getattr(struct obd_export *exp, struct lov_stripe_md *lsm,
 
         set = ptlrpc_prep_set();
         if (set == NULL) {
-                CERROR ("ENOMEM allocing request set\n");
                 rc = -ENOMEM;
         } else {
                 rc = obd_getattr_async(exp, oa, lsm, set);
@@ -383,13 +391,27 @@ void ll_pgcache_remove_extent(struct inode *inode, struct lov_stripe_md *lsm,
         if (end < tmpex.l_extent.end >> PAGE_CACHE_SHIFT)
                 end = ~0;
 
-        i = (inode->i_size + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT;
+        i = inode->i_size ? (inode->i_size - 1) >> PAGE_CACHE_SHIFT : 0;
         if (i < end)
                 end = i;
 
         CDEBUG(D_INODE|D_PAGE, "walking page indices start: %lu j: %lu "
                "count: %lu skip: %lu end: %lu%s\n", start, start % count,
                count, skip, end, discard ? " (DISCARDING)" : "");
+        
+        /* walk through the vmas on the inode and tear down mmaped pages that
+         * intersect with the lock.  this stops immediately if there are no
+         * mmap()ed regions of the file.  This is not efficient at all and
+         * should be short lived. We'll associate mmap()ed pages with the lock
+         * and will be able to find them directly */
+        
+        for (i = start; i <= end; i += (j + skip)) {
+                j = min(count - (i % count), end - i + 1);
+                LASSERT(inode->i_mapping);
+                if (ll_teardown_mmaps(inode->i_mapping, i << PAGE_CACHE_SHIFT,
+                                      ((i+j) << PAGE_CACHE_SHIFT) - 1) )
+                        break;
+        }
 
         /* this is the simplistic implementation of page eviction at
          * cancelation.  It is careful to get races with other page
@@ -445,6 +467,7 @@ void ll_pgcache_remove_extent(struct inode *inode, struct lov_stripe_md *lsm,
                 if (rc2 == 0 && page->mapping != NULL) {
                         // checking again to account for writeback's lock_page()
                         LL_CDEBUG_PAGE(D_PAGE, page, "truncating\n");
+                        ll_ra_accounting(page, inode->i_mapping);
                         ll_truncate_complete_page(page);
                 }
                 unlock_page(page);
@@ -505,7 +528,13 @@ static int ll_extent_lock_callback(struct ldlm_lock *lock,
                         goto iput;
                 ll_pgcache_remove_extent(inode, lsm, lock, stripe);
 
+                /* grabbing the i_sem will wait for write() to complete.  ns
+                 * lock hold times should be very short as ast processing
+                 * requires them and has a short timeout.  so, i_sem before ns
+                 * lock.*/
+
                 down(&inode->i_sem);
+                l_lock(&lock->l_resource->lr_namespace->ns_lock);
                 kms = ldlm_extent_shift_kms(lock,
                                             lsm->lsm_oinfo[stripe].loi_kms);
 		
@@ -513,6 +542,7 @@ static int ll_extent_lock_callback(struct ldlm_lock *lock,
                         LDLM_DEBUG(lock, "updating kms from "LPU64" to "LPU64,
                                    lsm->lsm_oinfo[stripe].loi_kms, kms);
                 lsm->lsm_oinfo[stripe].loi_kms = kms;
+                l_unlock(&lock->l_resource->lr_namespace->ns_lock);
                 up(&inode->i_sem);
                 //ll_try_done_writing(inode);
         iput:
@@ -559,6 +589,7 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data)
                 lvb = lock->l_lvb_data;
                 lsm->lsm_oinfo[stripe].loi_rss = lvb->lvb_size;
 
+                l_lock(&lock->l_resource->lr_namespace->ns_lock);
                 down(&inode->i_sem);
                 kms = MAX(lsm->lsm_oinfo[stripe].loi_kms, lvb->lvb_size);
                 kms = ldlm_extent_shift_kms(NULL, kms);
@@ -567,6 +598,7 @@ int ll_async_completion_ast(struct ldlm_lock *lock, int flags, void *data)
                                    lsm->lsm_oinfo[stripe].loi_kms, kms);
                 lsm->lsm_oinfo[stripe].loi_kms = kms;
                 up(&inode->i_sem);
+                l_unlock(&lock->l_resource->lr_namespace->ns_lock);
         }
 
 iput:
@@ -585,6 +617,7 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         struct inode *inode = ll_inode_from_lock(lock);
         struct ll_inode_info *lli;
         struct ost_lvb *lvb;
+        struct lov_stripe_md *lsm;
         int rc, size = sizeof(*lvb), stripe;
         ENTRY;
 
@@ -593,7 +626,9 @@ static int ll_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         lli = ll_i2info(inode);
         if (lli == NULL)
                 GOTO(iput, rc = -ELDLM_NO_LOCK_DATA);
-        if (lli->lli_smd == NULL)
+
+        lsm = lli->lli_smd;
+        if (lsm == NULL)
                 GOTO(iput, rc = -ELDLM_NO_LOCK_DATA);
 
         /* First, find out which stripe index this lock corresponds to. */
@@ -632,7 +667,7 @@ __u64 lov_merge_mtime(struct lov_stripe_md *lsm, __u64 current_time);
 
 /* NB: lov_merge_size will prefer locally cached writes if they extend the
  * file (because it prefers KMS over RSS when larger) */
-int ll_glimpse_size(struct inode *inode, struct ost_lvb *lvb)
+int ll_glimpse_size(struct inode *inode)
 {
         struct ll_inode_info *lli = ll_i2info(inode);
         struct ll_sb_info *sbi = ll_i2sbi(inode);
@@ -646,30 +681,44 @@ int ll_glimpse_size(struct inode *inode, struct ost_lvb *lvb)
         rc = obd_enqueue(sbi->ll_osc_exp, lli->lli_smd, LDLM_EXTENT, &policy,
                          LCK_PR, &flags, ll_extent_lock_callback,
                          ldlm_completion_ast, ll_glimpse_callback, inode,
-                         sizeof(*lvb), lustre_swab_ost_lvb, &lockh);
+                         sizeof(struct ost_lvb), lustre_swab_ost_lvb, &lockh);
+        if (rc == -ENOENT)
+                RETURN(rc);
+
         if (rc != 0) {
                 CERROR("obd_enqueue returned rc %d, returning -EIO\n", rc);
                 RETURN(rc > 0 ? -EIO : rc);
         }
 
-        lvb->lvb_size = lov_merge_size(lli->lli_smd, 0);
+        inode->i_size = lov_merge_size(lli->lli_smd, 0);
         inode->i_blocks = lov_merge_blocks(lli->lli_smd);
         //inode->i_mtime = lov_merge_mtime(lli->lli_smd, inode->i_mtime);
 
-        CDEBUG(D_DLMTRACE, "glimpse: size: "LPU64", blocks: "LPU64"\n",
-               lvb->lvb_size, lvb->lvb_blocks);
-
+        CDEBUG(D_DLMTRACE, "glimpse: size: %llu, blocks: %lu\n",
+               inode->i_size, inode->i_blocks);
         obd_cancel(sbi->ll_osc_exp, lli->lli_smd, LCK_PR, &lockh);
 
         RETURN(rc);
 }
 
+void ll_stime_record(struct ll_sb_info *sbi, struct timeval *start,
+                    struct obd_service_time *stime)
+{
+        struct timeval stop;
+        do_gettimeofday(&stop);
+                                                                                                                                                                                                     
+        spin_lock(&sbi->ll_lock);
+        lprocfs_stime_record(stime, &stop, start);
+        spin_unlock(&sbi->ll_lock);
+}
+
 int ll_extent_lock(struct ll_file_data *fd, struct inode *inode,
                    struct lov_stripe_md *lsm, int mode,
                    ldlm_policy_data_t *policy, struct lustre_handle *lockh,
-                   int ast_flags)
+                   int ast_flags, struct obd_service_time *stime)
 {
         struct ll_sb_info *sbi = ll_i2sbi(inode);
+        struct timeval start;
         int rc;
         ENTRY;
 
@@ -683,17 +732,31 @@ int ll_extent_lock(struct ll_file_data *fd, struct inode *inode,
         CDEBUG(D_DLMTRACE, "Locking inode %lu, start "LPU64" end "LPU64"\n",
                inode->i_ino, policy->l_extent.start, policy->l_extent.end);
 
+        do_gettimeofday(&start);
+        
         rc = obd_enqueue(sbi->ll_osc_exp, lsm, LDLM_EXTENT, policy, mode,
                          &ast_flags, ll_extent_lock_callback,
                          ldlm_completion_ast, ll_glimpse_callback, inode,
                          sizeof(struct ost_lvb), lustre_swab_ost_lvb, lockh);
         if (rc > 0)
                 rc = -EIO;
+        
+        ll_stime_record(sbi, &start, stime);
 
         if (policy->l_extent.start == 0 &&
-            policy->l_extent.end == OBD_OBJECT_EOF)
+            policy->l_extent.end == OBD_OBJECT_EOF) {
+                /* vmtruncate()->ll_truncate() first sets the i_size and then
+                 * the kms under both a DLM lock and the i_sem.  If we don't
+                 * get the i_sem here we can match the DLM lock and reset
+                 * i_size from the kms before the truncating path has updated
+                 * the kms.  generic_file_write can then trust the stale i_size
+                 * when doing appending writes and effectively cancel the
+                 * result of the truncate.  Getting the i_sem after the enqueue
+                 * maintains the DLM -> i_sem acquiry order. */
+                down(&inode->i_sem);
                 inode->i_size = lov_merge_size(lsm, 1);
-
+                up(&inode->i_sem);
+        }
         //inode->i_mtime = lov_merge_mtime(lsm, inode->i_mtime);
 
         RETURN(rc);
@@ -717,15 +780,14 @@ int ll_extent_unlock(struct ll_file_data *fd, struct inode *inode,
         RETURN(rc);
 }
 
-static ssize_t ll_file_read(struct file *filp, char *buf, size_t count,
+static ssize_t ll_file_read(struct file *file, char *buf, size_t count,
                             loff_t *ppos)
 {
-        struct ll_file_data *fd = filp->private_data;
-        struct inode *inode = filp->f_dentry->d_inode;
+        struct inode *inode = file->f_dentry->d_inode;
         struct ll_inode_info *lli = ll_i2info(inode);
         struct lov_stripe_md *lsm = lli->lli_smd;
-        struct lustre_handle lockh = { 0 };
-        ldlm_policy_data_t policy;
+        struct ll_lock_tree tree;
+        struct ll_lock_tree_node *node;
         int rc;
         ssize_t retval;
         __u64 kms;
@@ -744,12 +806,14 @@ static ssize_t ll_file_read(struct file *filp, char *buf, size_t count,
         if (!lsm)
                 RETURN(0);
 
-        policy.l_extent.start = *ppos;
-        policy.l_extent.end = *ppos + count - 1;
+        node = ll_node_from_inode(inode, *ppos, *ppos  + count - 1,
+                                  LCK_PR);
+
+        tree.lt_fd = file->private_data;
 
-        rc = ll_extent_lock(fd, inode, lsm, LCK_PR, &policy, &lockh,
-                                (filp->f_flags & O_NONBLOCK) ?
-                                        LDLM_FL_BLOCK_NOWAIT: 0);
+        rc = ll_tree_lock(&tree, node, inode, buf, count,
+                          file->f_flags & O_NONBLOCK ? LDLM_FL_BLOCK_NOWAIT :0);
+        
         if (rc != 0)
                 RETURN(rc);
 
@@ -757,11 +821,9 @@ static ssize_t ll_file_read(struct file *filp, char *buf, size_t count,
         if (*ppos + count - 1 > kms) {
                 /* A glimpse is necessary to determine whether we return a short
                  * read or some zeroes at the end of the buffer */
-                struct ost_lvb lvb;
-                retval = ll_glimpse_size(inode, &lvb);
+                retval = ll_glimpse_size(inode);
                 if (retval)
                         goto out;
-                inode->i_size = lvb.lvb_size;
         } else {
                 inode->i_size = kms;
         }
@@ -771,34 +833,28 @@ static ssize_t ll_file_read(struct file *filp, char *buf, size_t count,
 
         /* turn off the kernel's read-ahead */
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-        filp->f_ramax = 0;
+        file->f_ramax = 0;
 #else
-        filp->f_ra.ra_pages = 0;
+        file->f_ra.ra_pages = 0;
 #endif
-        retval = generic_file_read(filp, buf, count, ppos);
+        retval = generic_file_read(file, buf, count, ppos);
 
  out:
-        ll_extent_unlock(fd, inode, lsm, LCK_PR, &lockh);
+        ll_tree_unlock(&tree, inode);
         RETURN(retval);
 }
 
-/*
- * Write to a file (through the page cache).
- */
 static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
                              loff_t *ppos)
 {
-        struct ll_file_data *fd = file->private_data;
         struct inode *inode = file->f_dentry->d_inode;
-        struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
-        struct lustre_handle lockh = { 0 };
-        ldlm_policy_data_t policy;
         loff_t maxbytes = ll_file_maxbytes(inode);
+        struct ll_lock_tree tree;
+        struct ll_lock_tree_node *node;
         ssize_t retval;
-        int nonblock = 0, rc;
+        int rc;
+
         ENTRY;
-        if (file->f_flags & O_NONBLOCK)
-                nonblock = LDLM_FL_BLOCK_NOWAIT;
         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),size="LPSZ",offset=%Ld\n",
                inode->i_ino, inode->i_generation, inode, count, *ppos);
 
@@ -810,20 +866,25 @@ static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
 
         /* If file was opened for LL_IOC_LOV_SETSTRIPE but the ioctl wasn't
          * called on the file, don't fail the below assertion (bug 2388). */
-        if (file->f_flags & O_LOV_DELAY_CREATE && lsm == NULL)
+        if (file->f_flags & O_LOV_DELAY_CREATE &&
+            ll_i2info(inode)->lli_smd == NULL)
                 RETURN(-EBADF);
 
-        LASSERT(lsm);
+        LASSERT(ll_i2info(inode)->lli_smd != NULL);
+        
+        if (file->f_flags & O_APPEND)
+                node = ll_node_from_inode(inode, 0, OBD_OBJECT_EOF, LCK_PW);
+        else
+                node = ll_node_from_inode(inode, *ppos, *ppos  + count - 1,
+                                          LCK_PW);
 
-        if (file->f_flags & O_APPEND) {
-                policy.l_extent.start = 0;
-                policy.l_extent.end = OBD_OBJECT_EOF;
-        } else  {
-                policy.l_extent.start = *ppos;
-                policy.l_extent.end = *ppos + count - 1;
-        }
+        if (IS_ERR(node))
+                RETURN(PTR_ERR(node));
+
+        tree.lt_fd = file->private_data;
 
-        rc = ll_extent_lock(fd, inode, lsm, LCK_PW, &policy, &lockh, nonblock);
+        rc = ll_tree_lock(&tree, node, inode, buf, count,
+                          file->f_flags & O_NONBLOCK ? LDLM_FL_BLOCK_NOWAIT :0);
         if (rc != 0)
                 RETURN(rc);
 
@@ -848,7 +909,8 @@ static ssize_t ll_file_write(struct file *file, const char *buf, size_t count,
         retval = generic_file_write(file, buf, count, ppos);
 
 out:
-        ll_extent_unlock(fd, inode, lsm, LCK_PW, &lockh);
+        ll_tree_unlock(&tree, inode);
+        /* serialize with mmap/munmap/mremap */
         lprocfs_counter_add(ll_i2sbi(inode)->ll_stats, LPROC_LL_WRITE_BYTES,
                             retval > 0 ? retval : 0);
         RETURN(retval);
@@ -876,26 +938,19 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file,
                 RETURN(-EFAULT);
         }
         oa = obdo_alloc();
-        if (oa == NULL) {
+        if (oa == NULL) 
                 RETURN(-ENOMEM);
-        }
 
         down(&lli->lli_open_sem);
         lsm = lli->lli_smd;
-        if (lsm == NULL) {
-                up(&lli->lli_open_sem);
-                obdo_free(oa);
-                RETURN (-ENOENT);
-        }
+        if (lsm == NULL)
+                GOTO(out, rc = -ENOENT);
         lsm_size = sizeof(*lsm) + (sizeof(struct lov_oinfo) *
                    (lsm->lsm_stripe_count));
 
         OBD_ALLOC(lsm2, lsm_size);
-        if (lsm2 == NULL) {
-                up(&lli->lli_open_sem);
-                obdo_free(oa);
-                RETURN(-ENOMEM);
-        }
+        if (lsm2 == NULL)
+                GOTO(out, rc = -ENOMEM);
 
         oa->o_id = ucreatp.lrc_id;
         oa->o_nlink = ucreatp.lrc_ost_idx;
@@ -909,8 +964,10 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file,
         memcpy(lsm2, lsm, lsm_size);
         rc = obd_create(exp, oa, &lsm2, &oti);
 
-        up(&lli->lli_open_sem);
         OBD_FREE(lsm2, lsm_size);
+        GOTO(out, rc);
+out:
+        up(&lli->lli_open_sem);
         obdo_free(oa);
         RETURN (rc);
 }
@@ -1022,6 +1079,11 @@ static int ll_lov_setstripe(struct inode *inode, struct file *file,
                 RETURN(-EFAULT);
 
         rc = ll_lov_setstripe_ea_info(inode, file, flags, &lum, sizeof(lum));
+        if (rc == 0) {
+                 put_user(0, &lump->lmm_stripe_count);
+                 rc = obd_iocontrol(LL_IOC_LOV_GETSTRIPE, ll_i2obdexp(inode),
+                                    0, ll_i2info(inode)->lli_smd, lump);
+        }
         RETURN(rc);
 }
 
@@ -1056,7 +1118,8 @@ static int ll_get_grouplock(struct inode *inode, struct file *file,
         if (file->f_flags & O_NONBLOCK)
                 flags = LDLM_FL_BLOCK_NOWAIT;
 
-        rc = ll_extent_lock(fd, inode, lsm, LCK_GROUP, &policy, &lockh, flags);
+        rc = ll_extent_lock(fd, inode, lsm, LCK_GROUP, &policy, &lockh, flags,
+                            &ll_i2sbi(inode)->ll_grouplock_stime);
         if (rc != 0)
                 RETURN(rc);
 
@@ -1143,6 +1206,9 @@ int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                 RETURN(ll_get_grouplock(inode, file, arg));
         case LL_IOC_GROUP_UNLOCK:
                 RETURN(ll_put_grouplock(inode, file, arg));
+        case EXT3_IOC_GETVERSION_OLD:
+        case EXT3_IOC_GETVERSION:
+                return put_user(inode->i_generation, (int *) arg);
         /* We need to special case any other ioctls we want to handle,
          * to send them to the MDS/OST as appropriate and to properly
          * network encode the arg field.
@@ -1150,6 +1216,8 @@ int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
         case EXT2_IOC_GETVERSION_NEW:
         case EXT2_IOC_SETVERSION_OLD:
         case EXT2_IOC_SETVERSION_NEW:
+        case EXT3_IOC_SETVERSION_OLD:
+        case EXT3_IOC_SETVERSION:
         */
         default:
                 RETURN( obd_iocontrol(cmd, ll_i2obdexp(inode), 0, NULL,
@@ -1171,14 +1239,14 @@ loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
 
         lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_LLSEEK);
         if (origin == 2) { /* SEEK_END */
-                int nonblock = 0, rc;
                 ldlm_policy_data_t policy = { .l_extent = {0, OBD_OBJECT_EOF }};
+                int nonblock = 0, rc;
 
                 if (file->f_flags & O_NONBLOCK)
                         nonblock = LDLM_FL_BLOCK_NOWAIT;
 
                 rc = ll_extent_lock(fd, inode, lsm, LCK_PR, &policy, &lockh,
-                                     nonblock);
+                                    nonblock, &ll_i2sbi(inode)->ll_seek_stime);
                 if (rc != 0)
                         RETURN(rc);
 
@@ -1340,15 +1408,18 @@ int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it)
         struct inode *inode = dentry->d_inode;
         struct ll_inode_info *lli;
         struct lov_stripe_md *lsm;
-        struct ll_fid fid;
+        struct ptlrpc_request *req = NULL;
+        struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
+        struct lookup_intent oit = { .it_op = IT_GETATTR };
+        struct ll_fid  cfid;
         int rc;
+        
         ENTRY;
 
         if (!inode) {
                 CERROR("REPORT THIS LINE TO PETER\n");
                 RETURN(0);
         }
-        ll_inode2fid(&fid, inode);
         lli = ll_i2info(inode);
         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),name=%s,intent=%s\n",
                inode->i_ino, inode->i_generation, inode, dentry->d_name.name,
@@ -1357,44 +1428,40 @@ int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it)
         lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_REVALIDATE);
 #endif
 
-        if (!md_valid_attrs(ll_i2mdcexp(inode), &fid)) {
-                struct ptlrpc_request *req = NULL;
-                struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
-                struct ll_fid fid;
-                unsigned long valid = 0;
-                int ealen = 0;
+        ll_inode2fid(&cfid, dentry->d_inode);
+        rc = md_intent_lock(sbi->ll_mdc_exp, &cfid,
+                            NULL, 0, NULL, 0, &cfid, &oit, 0, &req,
+                            ll_mdc_blocking_ast);
+        if (rc < 0)
+                GOTO(out, rc);
 
-                if (S_ISREG(inode->i_mode)) {
-                        ealen = obd_size_diskmd(sbi->ll_osc_exp, NULL);
-                        valid |= OBD_MD_FLEASIZE;
-                }
-                ll_inode2fid(&fid, inode);
-                rc = md_getattr(sbi->ll_mdc_exp, &fid, valid, ealen, &req);
-                if (rc) {
-                        CERROR("failure %d inode %lu\n", rc, inode->i_ino);
-                        RETURN(-abs(rc));
-                }
-                rc = ll_prep_inode(sbi->ll_osc_exp, sbi->ll_mdc_exp,
-                                   &inode, req, 0, NULL);
-                if (rc) {
-                        ptlrpc_req_finished(req);
-                        RETURN(rc);
-                }
-                ptlrpc_req_finished(req);
+        rc = revalidate_it_finish(req, 1, &oit, dentry);
+        if (rc) {
+                ll_intent_release(&oit);
+                GOTO(out, rc);
         }
 
+        if (dentry->d_iname[0] != '/') { /* Do not rehash root of the tree
+                                            dentries */
+                spin_lock(&dcache_lock);
+                hlist_del_init(&dentry->d_hash);
+                __d_rehash(dentry, 0);
+                spin_unlock(&dcache_lock);
+        }
+        ll_lookup_finish_locks(&oit, dentry);
+        dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
+
+
         lsm = lli->lli_smd;
         if (lsm == NULL) /* object not yet allocated, don't validate size */
-                RETURN(0);
+                GOTO(out, rc = 0);
 
         /* ll_glimpse_size will prefer locally cached writes if they extend
          * the file */
-        {
-                struct ost_lvb lvb;
-
-                rc = ll_glimpse_size(inode, &lvb);
-                inode->i_size = lvb.lvb_size;
-        }
+        rc = ll_glimpse_size(inode);
+out:
+        if (req)
+                ptlrpc_req_finished(req);
         RETURN(rc);
 }
 
@@ -1411,7 +1478,7 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de,
         if (res)
                 return res;
 
-        stat->dev = inode->i_sb->s_dev;
+        stat->dev = ll_i2info(inode)->lli_mds;
         stat->ino = inode->i_ino;
         stat->mode = inode->i_mode;
         stat->nlink = inode->i_nlink;
@@ -1434,7 +1501,7 @@ struct file_operations ll_file_operations = {
         .ioctl          = ll_file_ioctl,
         .open           = ll_file_open,
         .release        = ll_file_release,
-        .mmap           = generic_file_mmap,
+        .mmap           = ll_file_mmap,
         .llseek         = ll_file_seek,
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
         .sendfile       = generic_file_sendfile,
diff --git a/lustre/llite/llite_close.c b/lustre/llite/llite_close.c
index 615871375e..f0d3f53723 100644
--- a/lustre/llite/llite_close.c
+++ b/lustre/llite/llite_close.c
@@ -133,7 +133,7 @@ static void ll_close_done_writing(struct inode *inode)
                 goto rpc;
 
         rc = ll_extent_lock(NULL, inode, lli->lli_smd, LCK_PW, &policy, &lockh,
-                            ast_flags);
+                            ast_flags, &ll_i2sbi(inode)->ll_done_stime);
         if (rc != 0) {
                 CERROR("lock acquisition failed (%d): unable to send "
                        "DONE_WRITING for inode %lu/%u\n", rc, inode->i_ino,
diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h
index da6bb98df9..ce9246108e 100644
--- a/lustre/llite/llite_internal.h
+++ b/lustre/llite/llite_internal.h
@@ -14,9 +14,29 @@
  * up in 512k readahead requests serviced at 40ms each is about 1GB/s. */
 #define SBI_DEFAULT_RA_MAX ((40 << 20) >> PAGE_CACHE_SHIFT)
 
+enum ra_stat {
+        RA_STAT_HIT = 0,
+        RA_STAT_MISS,
+        RA_STAT_DISTANT_READPAGE,
+        RA_STAT_MISS_IN_WINDOW,
+        RA_STAT_FAILED_MATCH,
+        RA_STAT_DISCARDED,
+        RA_STAT_ZERO_LEN,
+        RA_STAT_ZERO_WINDOW,
+        RA_STAT_EOF,
+        RA_STAT_MAX_IN_FLIGHT,
+        _NR_RA_STAT,
+};
+
+struct ll_ra_info {
+        unsigned long             ra_cur_pages;
+        unsigned long             ra_max_pages;
+        unsigned long             ra_stats[_NR_RA_STAT];
+};
+
 struct ll_sb_info {
-        /* this protects pglist and max_r_a_pages.  It isn't safe to
-         * grab from interrupt contexts */
+        /* this protects pglist and ra_info.  It isn't safe to 
+        * grab from interrupt contexts */
         spinlock_t                ll_lock;
         struct obd_uuid           ll_sb_uuid;
         struct obd_export        *ll_mdc_exp;
@@ -38,8 +58,17 @@ struct ll_sb_info {
         unsigned long             ll_pglist_gen;
         struct list_head          ll_pglist;
 
-        unsigned long             ll_read_ahead_pages;
-        unsigned long             ll_max_read_ahead_pages;
+        struct ll_ra_info         ll_ra_info;
+                                                                                                                                                                                                     
+        /* times spent waiting for locks in each call site.  These are
+         * all protected by the ll_lock */
+        struct obd_service_time   ll_read_stime;
+        struct obd_service_time   ll_write_stime;
+        struct obd_service_time   ll_grouplock_stime;
+        struct obd_service_time   ll_seek_stime;
+        struct obd_service_time   ll_setattr_stime;
+        struct obd_service_time   ll_brw_stime;
+//      struct obd_service_time   ll_done_stime;
 
         int                       ll_config_version; /* last-applied update */
 
@@ -111,8 +140,10 @@ struct ll_async_page {
         struct page     *llap_page;
         struct list_head llap_pending_write;
          /* only trust these if the page lock is providing exclusion */
-        int              llap_write_queued:1,
-                         llap_defer_uptodate:1;
+        unsigned         llap_write_queued:1,
+                         llap_defer_uptodate:1,
+                         llap_ra_used:1;
+
         struct list_head llap_proc_item;
 };
 
@@ -142,6 +173,7 @@ int ll_mdc_blocking_ast(struct ldlm_lock *, struct ldlm_lock_desc *,
 /* llite/rw.c */
 int ll_prepare_write(struct file *, struct page *, unsigned from, unsigned to);
 int ll_commit_write(struct file *, struct page *, unsigned from, unsigned to);
+int ll_writepage(struct page *page);
 void ll_inode_fill_obdo(struct inode *inode, int cmd, struct obdo *oa);
 void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc);
 void ll_removepage(struct page *page);
@@ -151,6 +183,7 @@ struct ll_async_page *llap_from_page(struct page *page);
 struct ll_async_page *llap_cast_private(struct page *page);
 void ll_readahead_init(struct inode *inode, struct ll_readahead_state *ras);
 
+void ll_ra_accounting(struct page *page, struct address_space *mapping);
 void ll_truncate(struct inode *inode);
 
 /* llite/file.c */
@@ -160,13 +193,14 @@ extern int ll_inode_revalidate_it(struct dentry *, struct lookup_intent *);
 int ll_refresh_lsm(struct inode *inode, struct lov_stripe_md *lsm);
 int ll_extent_lock(struct ll_file_data *, struct inode *,
                    struct lov_stripe_md *, int mode, ldlm_policy_data_t *,
-                   struct lustre_handle *, int ast_flags);
+                   struct lustre_handle *, int ast_flags,
+                   struct obd_service_time *);
 int ll_extent_unlock(struct ll_file_data *, struct inode *,
                      struct lov_stripe_md *, int mode, struct lustre_handle *);
 int ll_file_open(struct inode *inode, struct file *file);
 int ll_file_release(struct inode *inode, struct file *file);
 int ll_lsm_getattr(struct obd_export *, struct lov_stripe_md *, struct obdo *);
-int ll_glimpse_size(struct inode *inode, struct ost_lvb *lvb);
+int ll_glimpse_size(struct inode *inode);
 int ll_local_open(struct file *file, struct lookup_intent *it);
 int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
                  struct file *file);
@@ -174,6 +208,8 @@ int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
 int ll_getattr(struct vfsmount *mnt, struct dentry *de,
                struct lookup_intent *it, struct kstat *stat);
 #endif
+void ll_stime_record(struct ll_sb_info *sbi, struct timeval *start,
+                     struct obd_service_time *stime);
 
 /* llite/dcache.c */
 void ll_intent_drop_lock(struct lookup_intent *);
@@ -182,6 +218,9 @@ extern void ll_set_dd(struct dentry *de);
 void ll_unhash_aliases(struct inode *);
 void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft);
 void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry);
+int revalidate_it_finish(struct ptlrpc_request *request, int offset,
+                         struct lookup_intent *it, struct dentry *de);
+
 
 /* llite/llite_gns.c */
 int ll_finish_gns(struct ll_sb_info *sbi);
@@ -199,8 +238,7 @@ extern struct super_operations lustre_super_operations;
 
 char *ll_read_opt(const char *opt, char *data);
 int ll_set_opt(const char *opt, char *data, int fl);
-void ll_options(char *options, char **ost, char **mds, int *flags, 
-                char **clone_ops);
+void ll_options(char *options, char **ost, char **mds, int *flags);
 void ll_lli_init(struct ll_inode_info *lli);
 int ll_fill_super(struct super_block *sb, void *data, int silent);
 int lustre_fill_super(struct super_block *sb, void *data, int silent);
@@ -259,6 +297,33 @@ void ll_queue_done_writing(struct inode *inode);
 void ll_close_thread_shutdown(struct ll_close_queue *lcq);
 int ll_close_thread_start(struct ll_close_queue **lcq_ret);
 
+
+/* llite/llite_mmap.c */
+#if  (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+typedef struct rb_root  rb_root_t;
+typedef struct rb_node  rb_node_t;
+#endif
+
+struct ll_lock_tree_node;
+struct ll_lock_tree {
+        rb_root_t                       lt_root;
+        struct list_head                lt_locked_list;
+        struct ll_file_data             *lt_fd;
+};
+int ll_teardown_mmaps(struct address_space *mapping, __u64 first,
+                      __u64 last);
+int ll_file_mmap(struct file * file, struct vm_area_struct * vma);
+struct ll_lock_tree_node * ll_node_from_inode(struct inode *inode, __u64 start,
+                                              __u64 end, ldlm_mode_t mode);
+int ll_tree_lock(struct ll_lock_tree *tree,
+                 struct ll_lock_tree_node *first_node, struct inode *inode,
+                 const char *buf, size_t count, int ast_flags);
+int ll_tree_unlock(struct ll_lock_tree *tree, struct inode *inode);
+
+
+
+
+
 /* generic */
 #define LL_SBI_NOLCK           0x1
 #define LL_SBI_READAHEAD       0x2
diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
index b4ba72d2c4..4ab2c4a42d 100644
--- a/lustre/llite/llite_lib.c
+++ b/lustre/llite/llite_lib.c
@@ -56,7 +56,10 @@ struct ll_sb_info *lustre_init_sbi(struct super_block *sb)
         spin_lock_init(&sbi->ll_lock);
         INIT_LIST_HEAD(&sbi->ll_pglist);
         sbi->ll_pglist_gen = 0;
-        sbi->ll_max_read_ahead_pages = SBI_DEFAULT_RA_MAX;
+        if (num_physpages < SBI_DEFAULT_RA_MAX / 4)
+                sbi->ll_ra_info.ra_max_pages = num_physpages / 4;
+        else
+                sbi->ll_ra_info.ra_max_pages = SBI_DEFAULT_RA_MAX;
         INIT_LIST_HEAD(&sbi->ll_conn_chain);
         INIT_HLIST_HEAD(&sbi->ll_orphan_dentry_list);
         INIT_LIST_HEAD(&sbi->ll_mnt_list);
@@ -323,8 +326,7 @@ int ll_set_opt(const char *opt, char *data, int fl)
                 RETURN(fl);
 }
 
-void ll_options(char *options, char **ost, char **mdc, int *flags, 
-                char **clone_opts)
+void ll_options(char *options, char **ost, char **mdc, int *flags)
 {
         char *this_char;
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
@@ -349,9 +351,6 @@ void ll_options(char *options, char **ost, char **mdc, int *flags,
                         continue;
                 if (!*mdc && (*mdc = ll_read_opt("mdc", this_char)))
                         continue;
-                if (!*clone_opts && (*clone_opts = ll_read_opt("clone", 
-                                                                this_char))) 
-                        continue; 
                 if (!(*flags & LL_SBI_NOLCK) &&
                     ((*flags) = (*flags) |
                                 ll_set_opt("nolock", this_char,
@@ -377,7 +376,6 @@ int ll_fill_super(struct super_block *sb, void *data, int silent)
         struct ll_sb_info *sbi;
         char *osc = NULL;
         char *mdc = NULL;
-        char *clone_opts = NULL;
         int err;
         ENTRY;
 
@@ -388,7 +386,7 @@ int ll_fill_super(struct super_block *sb, void *data, int silent)
                 RETURN(-ENOMEM);
 
         sbi->ll_flags |= LL_SBI_READAHEAD;
-        ll_options(data, &osc, &mdc, &sbi->ll_flags, &clone_opts);
+        ll_options(data, &osc, &mdc, &sbi->ll_flags);
 
         if (!osc) {
                 CERROR("no osc\n");
@@ -409,8 +407,6 @@ out:
                 OBD_FREE(mdc, strlen(mdc) + 1);
         if (osc)
                 OBD_FREE(osc, strlen(osc) + 1);
-        if (clone_opts)
-                OBD_FREE(clone_opts, strlen(clone_opts) + 1);
 
         RETURN(err);
 } /* ll_read_super */
@@ -447,8 +443,9 @@ static int lustre_process_log(struct lustre_mount_data *lmd, char *profile,
                         GOTO(out, err);
         }
 
-        if (lmd->lmd_nal == SOCKNAL) {
-                PCFG_INIT(pcfg, NAL_CMD_ADD_AUTOCONN);
+        if (lmd->lmd_nal == SOCKNAL ||
+              lmd->lmd_nal == OPENIBNAL) {
+                PCFG_INIT(pcfg, NAL_CMD_ADD_PEER);
                 pcfg.pcfg_nal     = lmd->lmd_nal;
                 pcfg.pcfg_nid     = lmd->lmd_server_nid;
                 pcfg.pcfg_id      = lmd->lmd_server_ipaddr;
@@ -532,12 +529,12 @@ out_del_uuid:
         err = class_process_config(&lcfg);
 
 out_del_conn:
-        if (lmd->lmd_nal == SOCKNAL) {
-                PCFG_INIT(pcfg, NAL_CMD_DEL_AUTOCONN);
+        if (lmd->lmd_nal == SOCKNAL ||
+            lmd->lmd_nal == OPENIBNAL) {
+                PCFG_INIT(pcfg, NAL_CMD_DEL_PEER);
                 pcfg.pcfg_nal     = lmd->lmd_nal;
                 pcfg.pcfg_nid     = lmd->lmd_server_nid;
-                pcfg.pcfg_id      = lmd->lmd_server_ipaddr;
-                pcfg.pcfg_flags   = 1; /*share*/
+                pcfg.pcfg_flags   = 1;          /* single_share */
                 err = libcfs_nal_cmd(&pcfg);
                 if (err <0)
                         GOTO(out, err);
@@ -1028,7 +1025,7 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr)
                 LASSERT(atomic_read(&inode->i_sem.count) <= 0);
                 up(&inode->i_sem);
                 rc = ll_extent_lock(NULL, inode, lsm, LCK_PW, &policy, &lockh,
-                                    ast_flags);
+                                    ast_flags, &ll_i2sbi(inode)->ll_seek_stime);
                 down(&inode->i_sem);
                 if (rc != 0)
                         RETURN(rc);
@@ -1121,7 +1118,7 @@ int ll_statfs(struct super_block *sb, struct kstatfs *sfs)
         struct obd_statfs osfs;
         int rc;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:\n");
+        CDEBUG(D_VFSTRACE, "VFS Op: superblock %p\n", sb);
         lprocfs_counter_incr(ll_s2sbi(sb)->ll_stats, LPROC_LL_STAFS);
 
         /* For now we will always get up-to-date statfs values, but in the
@@ -1466,8 +1463,10 @@ void ll_umount_begin(struct super_block *sb)
         struct obd_device *obd;
         struct obd_ioctl_data ioc_data = { 0 };
         ENTRY;
-        CDEBUG(D_VFSTRACE, "VFS Op:\n");
-
+     
+        CDEBUG(D_VFSTRACE, "VFS Op: superblock %p count %d active %d\n", sb,
+               sb->s_count, atomic_read(&sb->s_active));
+        
         obd = class_exp2obd(sbi->ll_mdc_exp);
         if (obd == NULL) {
                 CERROR("Invalid MDC connection handle "LPX64"\n",
diff --git a/lustre/llite/llite_mmap.c b/lustre/llite/llite_mmap.c
new file mode 100644
index 0000000000..68af4ac393
--- /dev/null
+++ b/lustre/llite/llite_mmap.c
@@ -0,0 +1,488 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/config.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/version.h>
+#include <asm/system.h>
+#include <asm/uaccess.h>
+
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <asm/uaccess.h>
+#include <asm/segment.h>
+#include <linux/mm.h>
+#include <linux/pagemap.h>
+#include <linux/smp_lock.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include <linux/iobuf.h>
+#endif
+
+#define DEBUG_SUBSYSTEM S_LLITE
+
+#include <linux/lustre_mds.h>
+#include <linux/lustre_lite.h>
+#include "llite_internal.h"
+#include <linux/lustre_compat25.h>
+
+
+struct ll_lock_tree_node {
+        rb_node_t               lt_node;
+        struct list_head        lt_locked_item;
+        __u64                   lt_oid;
+        ldlm_policy_data_t      lt_policy;
+        struct lustre_handle    lt_lockh;
+        ldlm_mode_t             lt_mode;
+};
+
+__u64 lov_merge_size(struct lov_stripe_md *lsm, int kms);
+int lt_get_mmap_locks(struct ll_lock_tree *tree, struct inode *inode,
+                      unsigned long addr, size_t count);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
+                       int *type);
+#else
+struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
+                       int unused);
+#endif
+
+struct ll_lock_tree_node * ll_node_from_inode(struct inode *inode, __u64 start,
+                                              __u64 end, ldlm_mode_t mode)
+{
+        struct ll_lock_tree_node *node;
+
+        OBD_ALLOC(node, sizeof(*node));
+        if (node == NULL)
+                RETURN(ERR_PTR(-ENOMEM));
+
+        node->lt_oid = ll_i2info(inode)->lli_smd->lsm_object_id;
+        node->lt_policy.l_extent.start = start;
+        node->lt_policy.l_extent.end = end;
+        memset(&node->lt_lockh, 0, sizeof(node->lt_lockh));
+        INIT_LIST_HEAD(&node->lt_locked_item);
+        node->lt_mode = mode;
+
+        return node;
+}
+
+int lt_compare(struct ll_lock_tree_node *one, struct ll_lock_tree_node *two)
+{
+        if ( one->lt_oid < two->lt_oid)
+                return -1;
+        if ( one->lt_oid > two->lt_oid)
+                return 1;
+
+        if ( one->lt_policy.l_extent.end < two->lt_policy.l_extent.start )
+                return -1;
+        if ( one->lt_policy.l_extent.start > two->lt_policy.l_extent.end )
+                return 1;
+
+        return 0; /* they are the same object and overlap */
+}
+
+static void lt_merge(struct ll_lock_tree_node *dst,
+                     struct ll_lock_tree_node *src)
+{
+        dst->lt_policy.l_extent.start = min(dst->lt_policy.l_extent.start,
+                                            src->lt_policy.l_extent.start);
+        dst->lt_policy.l_extent.end = max(dst->lt_policy.l_extent.end,
+                                          src->lt_policy.l_extent.end);
+
+        /* XXX could be a real call to the dlm to find superset modes */
+        if (src->lt_mode == LCK_PW && dst->lt_mode != LCK_PW)
+                dst->lt_mode = LCK_PW;
+}
+
+static void lt_insert(struct ll_lock_tree *tree,
+                      struct ll_lock_tree_node *node)
+{
+        struct ll_lock_tree_node *walk;
+        rb_node_t **p, *parent;
+        ENTRY;
+
+restart:
+        p = &tree->lt_root.rb_node;
+        parent = NULL;
+        while (*p) {
+                parent = *p;
+                walk = rb_entry(parent, struct ll_lock_tree_node, lt_node);
+                switch (lt_compare(node, walk)) {
+                case -1:
+                        p = &(*p)->rb_left;
+                        break;
+                case 1:
+                        p = &(*p)->rb_right;
+                        break;
+                case 0:
+                        lt_merge(node, walk);
+                        rb_erase(&walk->lt_node, &tree->lt_root);
+                        OBD_FREE(walk, sizeof(*walk));
+                        goto restart;
+                        break;
+                default:
+                        LBUG();
+                        break;
+                }
+        }
+        rb_link_node(&node->lt_node, parent, p);
+        rb_insert_color(&node->lt_node, &tree->lt_root);
+        EXIT;
+}
+
+static struct ll_lock_tree_node *lt_least_node(struct ll_lock_tree *tree)
+{
+        rb_node_t *rbnode;
+        struct ll_lock_tree_node *node = NULL;
+
+        for ( rbnode = tree->lt_root.rb_node; rbnode != NULL;
+              rbnode = rbnode->rb_left) {
+                if (rbnode->rb_left == NULL) {
+                        node = rb_entry(rbnode, struct ll_lock_tree_node,
+                                        lt_node);
+                        break;
+                }
+        }
+        RETURN(node);
+}
+
+int ll_tree_unlock(struct ll_lock_tree *tree, struct inode *inode)
+{
+        struct ll_lock_tree_node *node;
+        struct list_head *pos, *n;
+        int rc = 0;
+        ENTRY;
+
+        list_for_each_safe(pos, n, &tree->lt_locked_list) {
+                node = list_entry(pos, struct ll_lock_tree_node,
+                                  lt_locked_item);
+
+                rc = ll_extent_unlock(tree->lt_fd, inode,
+                                      ll_i2info(inode)->lli_smd, node->lt_mode,
+                                      &node->lt_lockh);
+                if (rc != 0) {
+                        /* XXX better message */
+                        CERROR("couldn't unlock %d\n", rc);
+                }
+                list_del(&node->lt_locked_item);
+                OBD_FREE(node, sizeof(*node));
+        }
+
+        while ((node = lt_least_node(tree))) {
+                rb_erase(&node->lt_node, &tree->lt_root);
+                OBD_FREE(node, sizeof(*node));
+        }
+
+        RETURN(rc);
+}
+int ll_tree_lock(struct ll_lock_tree *tree,
+                 struct ll_lock_tree_node *first_node, struct inode *inode,
+                 const char *buf, size_t count, int ast_flags)
+{
+        struct ll_lock_tree_node *node;
+        int rc = 0;
+        ENTRY;
+
+        tree->lt_root.rb_node = NULL;
+        INIT_LIST_HEAD(&tree->lt_locked_list);
+        if (first_node != NULL)
+                lt_insert(tree, first_node);
+
+        if (mapping_mapped(inode->i_mapping)) {
+                rc = lt_get_mmap_locks(tree, inode, (unsigned long)buf, count);
+                if (rc)
+                        GOTO(out, rc);
+        }
+
+        while ((node = lt_least_node(tree))) {
+                struct obd_service_time *stime;
+                stime = (node->lt_mode & LCK_PW) ?
+                        &ll_i2sbi(inode)->ll_write_stime :
+                        &ll_i2sbi(inode)->ll_read_stime;
+
+                rc = ll_extent_lock(tree->lt_fd, inode,
+                                    ll_i2info(inode)->lli_smd, node->lt_mode,
+                                    &node->lt_policy, &node->lt_lockh,
+                                    ast_flags, stime);
+                if (rc != 0)
+                        GOTO(out, rc);
+
+                rb_erase(&node->lt_node, &tree->lt_root);
+                list_add_tail(&node->lt_locked_item, &tree->lt_locked_list);
+        }
+        RETURN(rc);
+out:
+        ll_tree_unlock(tree, inode);
+        RETURN(rc);
+}
+
+static ldlm_mode_t mode_from_vma(struct vm_area_struct *vma)
+{
+        /* we only want to hold PW locks if the mmap() can generate
+         * writes back to the file and that only happens in shared
+         * writable vmas */
+        if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_WRITE))
+                return LCK_PW;
+        return LCK_PR;
+}
+
+static void policy_from_vma(ldlm_policy_data_t *policy,
+                            struct vm_area_struct *vma, unsigned long addr,
+                            size_t count)
+{
+        policy->l_extent.start = ((addr - vma->vm_start) & PAGE_CACHE_MASK) +
+                                 (vma->vm_pgoff << PAGE_CACHE_SHIFT);
+        policy->l_extent.end = (policy->l_extent.start + count - 1) |
+                               (PAGE_CACHE_SIZE - 1);
+}
+static struct vm_area_struct * our_vma(unsigned long addr, size_t count)
+{
+        struct mm_struct *mm = current->mm;
+        struct vm_area_struct *vma, *ret = NULL;
+        ENTRY;
+
+        spin_lock(&mm->page_table_lock);
+        for(vma = find_vma(mm, addr);
+            vma != NULL && vma->vm_start < (addr + count); vma = vma->vm_next) {
+                if (vma->vm_ops && vma->vm_ops->nopage == ll_nopage) {
+                        ret = vma;
+                        break;
+                }
+        }
+        spin_unlock(&mm->page_table_lock);
+        RETURN(ret);
+}
+
+int lt_get_mmap_locks(struct ll_lock_tree *tree, struct inode *inode,
+                      unsigned long addr, size_t count)
+{
+        struct vm_area_struct *vma;
+        struct ll_lock_tree_node *node;
+        ldlm_policy_data_t policy;
+        ENTRY;
+
+        if (count == 0)
+                RETURN(0);
+
+        /* we need to look up vmas on page aligned addresses */
+        count += addr & (PAGE_SIZE - 1);
+        addr -= addr & (PAGE_SIZE - 1);
+
+        while ((vma = our_vma(addr, count)) != NULL) {
+
+                policy_from_vma(&policy, vma, addr, count);
+                node = ll_node_from_inode(inode, policy.l_extent.start,
+                                          policy.l_extent.end,
+                                          mode_from_vma(vma));
+                if (IS_ERR(node)) {
+                        CERROR("not enough mem for lock_tree_node!\n");
+                        RETURN(-ENOMEM);
+                }
+                lt_insert(tree, node);
+
+                if (vma->vm_end - addr >= count)
+                        break;
+                count -= vma->vm_end - addr;
+                addr = vma->vm_end;
+        }
+        RETURN(0);
+}
+/* FIXME: there is a pagefault race goes as follow:
+ * 1. A user process on node A accesses a portion of a mapped file,
+ *    resulting in a page fault.  The pagefault handler invokes the
+ *    ll_nopage function, which reads the page into memory.
+ * 2. A user process on node B writes to the same portion of the file
+ *    (either via mmap or write()), that cause node A to cancel the
+ *    lock and truncate the page.
+ * 3. Node A then executes the rest of do_no_page(), entering the
+ *    now-invalid page into the PTEs.
+ *
+ * Make the whole do_no_page as a hook to cover both the page cache
+ * and page mapping installing with dlm lock would eliminate this race.
+ */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
+                       int *type)
+#else
+struct page *ll_nopage(struct vm_area_struct *vma, unsigned long address,
+                       int unused)
+#endif
+{
+        struct file *filp = vma->vm_file;
+        struct ll_file_data *fd = filp->private_data;
+        struct inode *inode = filp->f_dentry->d_inode;
+        struct lustre_handle lockh = { 0 };
+        ldlm_policy_data_t policy;
+        ldlm_mode_t mode;
+        struct page *page;
+        struct obd_service_time *stime;
+        __u64 kms;
+        unsigned long pgoff, size, rand_read, seq_read;
+        int rc = 0;
+        ENTRY;
+
+        if (ll_i2info(inode)->lli_smd == NULL) {
+                CERROR("No lsm on fault?\n");
+                RETURN(NULL);
+        }
+
+        /* start and end the lock on the first and last bytes in the page */
+        policy_from_vma(&policy, vma, address, PAGE_CACHE_SIZE);
+
+        CDEBUG(D_MMAP, "nopage vma %p inode %lu, locking ["LPU64", "LPU64"]\n",
+               vma, inode->i_ino, policy.l_extent.start,
+               policy.l_extent.end);
+
+        mode = mode_from_vma(vma);
+        stime = (mode & LCK_PW) ? &ll_i2sbi(inode)->ll_write_stime :
+                                  &ll_i2sbi(inode)->ll_read_stime;
+
+        rc = ll_extent_lock(fd, inode, ll_i2info(inode)->lli_smd, mode, &policy,
+                            &lockh, LDLM_FL_CBPENDING, stime);
+        if (rc != 0)
+                RETURN(NULL);
+
+        /* XXX change inode size without i_sem hold! there is a race condition
+         *     with truncate path. (see ll_extent_lock) */
+        kms = lov_merge_size(ll_i2info(inode)->lli_smd, 1);
+        pgoff = ((address - vma->vm_start) >> PAGE_CACHE_SHIFT) + vma->vm_pgoff;
+        size = (kms + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+
+        if (pgoff >= size)
+                ll_glimpse_size(inode);
+        else
+                inode->i_size = kms;
+
+        /* disable VM_SEQ_READ and use VM_RAND_READ to make sure that
+         * the kernel will not read other pages not covered by ldlm in
+         * filemap_nopage. we do our readahead in ll_readpage.
+         */
+        rand_read = vma->vm_flags & VM_RAND_READ;
+        seq_read = vma->vm_flags & VM_SEQ_READ;
+        vma->vm_flags &= ~ VM_SEQ_READ;
+        vma->vm_flags |= VM_RAND_READ;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+        page = filemap_nopage(vma, address, type);
+#else
+        page = filemap_nopage(vma, address, unused);
+#endif
+        vma->vm_flags &= ~VM_RAND_READ;
+        vma->vm_flags |= (rand_read | seq_read);
+
+        ll_extent_unlock(fd, inode, ll_i2info(inode)->lli_smd, mode, &lockh);
+        RETURN(page);
+}
+
+/* return the user space pointer that maps to a file offset via a vma */
+static inline unsigned long file_to_user(struct vm_area_struct *vma,
+                                         __u64 byte)
+{
+        return vma->vm_start +
+               (byte - ((__u64)vma->vm_pgoff << PAGE_CACHE_SHIFT));
+
+}
+
+#define VMA_DEBUG(vma, fmt, arg...)                                          \
+        CDEBUG(D_MMAP, "vma(%p) start(%ld) end(%ld) pgoff(%ld) inode(%p): "  \
+               fmt, vma, vma->vm_start, vma->vm_end, vma->vm_pgoff,          \
+               vma->vm_file->f_dentry->d_inode, ## arg);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+/* [first, last] are the byte offsets affected.
+ * vm_{start, end} are user addresses of the first byte of the mapping and
+ *      the next byte beyond it
+ * vm_pgoff is the page index of the first byte in the mapping */
+static void teardown_vmas(struct vm_area_struct *vma, __u64 first,
+                          __u64 last)
+{
+        unsigned long address, len;
+        for (; vma ; vma = vma->vm_next_share) {
+                if (last >> PAGE_CACHE_SHIFT < vma->vm_pgoff)
+                        continue;
+                if (first >> PAGE_CACHE_SHIFT > (vma->vm_pgoff +
+                    ((vma->vm_end - vma->vm_start) >> PAGE_CACHE_SHIFT)))
+                        continue;
+
+                address = max((unsigned long)vma->vm_start,
+                              file_to_user(vma, first));
+                len = min((unsigned long)vma->vm_end,
+                          file_to_user(vma, last) + 1) - address;
+
+                VMA_DEBUG(vma, "zapping vma [address=%ld len=%ld]\n",
+                          address, len);
+                LASSERT(vma->vm_mm);
+                ll_zap_page_range(vma, address, len);
+        }
+}
+#endif
+
+/* XXX put nice comment here.  talk about __free_pte -> dirty pages and
+ * nopage's reference passing to the pte */
+int ll_teardown_mmaps(struct address_space *mapping, __u64 first,
+                       __u64 last)
+{
+        int rc = -ENOENT;
+        ENTRY;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+        if (mapping_mapped(mapping)) {
+                rc = 0;
+                unmap_mapping_range(mapping, first + PAGE_SIZE - 1,
+                                    last - first + 1, 1);
+        }
+#else
+        spin_lock(&mapping->i_shared_lock);
+        if (mapping->i_mmap != NULL) {
+                rc = 0;
+                teardown_vmas(mapping->i_mmap, first, last);
+        }
+        if (mapping->i_mmap_shared != NULL) {
+                rc = 0;
+                teardown_vmas(mapping->i_mmap_shared, first, last);
+        }
+        spin_unlock(&mapping->i_shared_lock);
+#endif
+
+        RETURN(rc);
+}
+
+static struct vm_operations_struct ll_file_vm_ops = {
+        .nopage         = ll_nopage,
+};
+
+int ll_file_mmap(struct file * file, struct vm_area_struct * vma)
+{
+        int rc;
+        ENTRY;
+
+        rc = generic_file_mmap(file, vma);
+        if (rc == 0)
+                vma->vm_ops = &ll_file_vm_ops;
+
+        RETURN(rc);
+}
+
diff --git a/lustre/llite/llite_nfs.c b/lustre/llite/llite_nfs.c
index 7c0c8272b8..7615751889 100644
--- a/lustre/llite/llite_nfs.c
+++ b/lustre/llite/llite_nfs.c
@@ -116,7 +116,7 @@ static struct dentry *ll_iget_for_nfs(struct super_block *sb, unsigned long ino,
                 result = list_entry(lp,struct dentry, d_alias);
                 if (!(result->d_flags & DCACHE_DISCONNECTED)) {
                         dget_locked(result);
-                        result->d_vfs_flags |= DCACHE_REFERENCED;
+                        ll_set_dflags(result, DCACHE_REFERENCED);
                         spin_unlock(&dcache_lock);
                         iput(inode);
                         return result;
diff --git a/lustre/llite/lproc_llite.c b/lustre/llite/lproc_llite.c
index 1b05eb9923..665e9d7206 100644
--- a/lustre/llite/lproc_llite.c
+++ b/lustre/llite/lproc_llite.c
@@ -32,6 +32,9 @@
 /* /proc/lustre/llite mount point registration */
 struct proc_dir_entry *proc_lustre_fs_root;
 struct file_operations llite_dump_pgcache_fops;
+struct file_operations ll_ra_stats_fops;
+struct file_operations llite_wait_times_fops;
+
 
 #ifndef LPROCFS
 int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
@@ -202,8 +205,8 @@ static int ll_wr_read_ahead(struct file *file, const char *buffer,
         struct ll_sb_info *sbi = ll_s2sbi(sb);
         int readahead;
         ENTRY;
-
-        if (1 != sscanf(buffer, "%d", &readahead))
+        
+        if (sscanf(buffer, "%d", &readahead) != 1)
                 RETURN(-EINVAL);
 
         if (readahead)
@@ -233,7 +236,7 @@ static int ll_rd_max_read_ahead_mb(char *page, char **start, off_t off,
         unsigned val;
 
         spin_lock(&sbi->ll_lock);
-        val = (sbi->ll_max_read_ahead_pages << PAGE_CACHE_SHIFT) >> 20;
+        val = (sbi->ll_ra_info.ra_max_pages << PAGE_CACHE_SHIFT) >> 20;
         spin_unlock(&sbi->ll_lock);
 
         return snprintf(page, count, "%u\n", val);
@@ -254,7 +257,7 @@ static int ll_wr_max_read_ahead_mb(struct file *file, const char *buffer,
                 return -ERANGE;
 
         spin_lock(&sbi->ll_lock);
-        sbi->ll_max_read_ahead_pages = (val << 20) >> PAGE_CACHE_SHIFT;
+        sbi->ll_ra_info.ra_max_pages = (val << 20) >> PAGE_CACHE_SHIFT;
         spin_unlock(&sbi->ll_lock);
 
         return count;
@@ -368,6 +371,18 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent,
         entry->proc_fops = &llite_dump_pgcache_fops;
         entry->data = sbi;
 
+        entry = create_proc_entry("wait_times", 0444, sbi->ll_proc_root);
+        if (entry == NULL)
+                GOTO(out, err = -ENOMEM);
+        entry->proc_fops = &llite_wait_times_fops;
+        entry->data = sbi;
+
+        entry = create_proc_entry("read_ahead_stats", 0444, sbi->ll_proc_root);
+        if (entry == NULL)
+                GOTO(out, err = -ENOMEM);
+        entry->proc_fops = &ll_ra_stats_fops;
+        entry->data = sbi;
+
         svc_stats = lprocfs_alloc_stats(LPROC_LL_FILE_OPCODES);
         if (svc_stats == NULL) {
                 err = -ENOMEM;
@@ -643,5 +658,203 @@ struct file_operations llite_dump_pgcache_fops = {
         .read    = seq_read,
         .release = llite_dump_pgcache_seq_release,
 };
+static int ll_ra_stats_seq_show(struct seq_file *seq, void *v)
+{
+        struct timeval now;
+        struct ll_sb_info *sbi = seq->private;
+        struct ll_ra_info *ra = &sbi->ll_ra_info;
+        int i;
+        static char *ra_stat_strings[] = {
+                [RA_STAT_HIT] = "hits",
+                [RA_STAT_MISS] = "misses",
+                [RA_STAT_DISTANT_READPAGE] = "readpage not consecutive",
+                [RA_STAT_MISS_IN_WINDOW] = "miss inside window",
+                [RA_STAT_FAILED_MATCH] = "failed lock match",
+                [RA_STAT_DISCARDED] = "read but discarded",
+                [RA_STAT_ZERO_LEN] = "zero length file",
+                [RA_STAT_ZERO_WINDOW] = "zero size window",
+                [RA_STAT_EOF] = "read-ahead to EOF",
+                [RA_STAT_MAX_IN_FLIGHT] = "hit max r-a issue",
+        };
+
+        do_gettimeofday(&now);
+
+        spin_lock(&sbi->ll_lock);
+
+        seq_printf(seq, "snapshot_time:         %lu:%lu (secs:usecs)\n",
+                   now.tv_sec, now.tv_usec);
+        seq_printf(seq, "pending issued pages:           %lu\n",
+                   ra->ra_cur_pages);
+
+        for(i = 0; i < _NR_RA_STAT; i++)
+                seq_printf(seq, "%-25s %lu\n", ra_stat_strings[i],
+                           ra->ra_stats[i]);
+
+        spin_unlock(&sbi->ll_lock);
+
+        return 0;
+}
+
+static void *ll_ra_stats_seq_start(struct seq_file *p, loff_t *pos)
+{
+        if (*pos == 0)
+                return (void *)1;
+        return NULL;
+}
+static void *ll_ra_stats_seq_next(struct seq_file *p, void *v, loff_t *pos)
+{
+        ++*pos;
+        return NULL;
+}
+static void ll_ra_stats_seq_stop(struct seq_file *p, void *v)
+{
+}
+struct seq_operations ll_ra_stats_seq_sops = {
+        .start = ll_ra_stats_seq_start,
+        .stop = ll_ra_stats_seq_stop,
+        .next = ll_ra_stats_seq_next,
+        .show = ll_ra_stats_seq_show,
+};
+
+static int ll_ra_stats_seq_open(struct inode *inode, struct file *file)
+{
+        struct proc_dir_entry *dp = PDE(inode);
+        struct seq_file *seq;
+        int rc;
+
+        rc = seq_open(file, &ll_ra_stats_seq_sops);
+        if (rc)
+                return rc;
+        seq = file->private_data;
+        seq->private = dp->data;
+        return 0;
+}
+
+static ssize_t ll_ra_stats_seq_write(struct file *file, const char *buf,
+                                       size_t len, loff_t *off)
+{
+        struct seq_file *seq = file->private_data;
+        struct ll_sb_info *sbi = seq->private;
+        struct ll_ra_info *ra = &sbi->ll_ra_info;
+
+        spin_lock(&sbi->ll_lock);
+        memset(ra->ra_stats, 0, sizeof(ra->ra_stats));
+        spin_unlock(&sbi->ll_lock);
+
+        return len;
+}
+
+struct file_operations ll_ra_stats_fops = {
+        .owner   = THIS_MODULE,
+        .open    = ll_ra_stats_seq_open,
+        .read    = seq_read,
+        .write   = ll_ra_stats_seq_write,
+        .llseek  = seq_lseek,
+        .release = seq_release,
+};
+
+#define PRINTF_STIME(stime) (unsigned long)(stime)->st_num,     \
+        lprocfs_stime_avg_ms(stime), lprocfs_stime_avg_us(stime)
+
+static int llite_wait_times_seq_show(struct seq_file *seq, void *v)
+{
+        struct ll_sb_info *sbi = seq->private;
+        struct timeval now;
+
+        do_gettimeofday(&now);
+
+        spin_lock(&sbi->ll_lock);
+
+        seq_printf(seq, "snapshot_time:         %lu:%lu (secs:usecs)\n\n",
+                   now.tv_sec, now.tv_usec);
+
+        seq_printf(seq, "lock wait times: (num, average ms)\n");
+        seq_printf(seq, "\tread\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_read_stime));
+        seq_printf(seq, "\twrite\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_write_stime));
+        seq_printf(seq, "\tgroup\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_grouplock_stime));
+        seq_printf(seq, "\tseek\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_seek_stime));
+        seq_printf(seq, "\tsetattr\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&sbi->ll_setattr_stime));
+
+        seq_printf(seq, "io path wait times: (num, average ms)\n");
+        seq_printf(seq, "\tll_brw\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_brw_stime));
+#if 0
+        seq_printf(seq, "\tdone\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&sbi->ll_done_stime));
+#endif
+
+        spin_unlock(&sbi->ll_lock);
+
+        return 0;
+}
+#undef pct
+
+static void *llite_wait_times_seq_start(struct seq_file *p, loff_t *pos)
+{
+        if (*pos == 0)
+                return (void *)1;
+        return NULL;
+}
+static void *llite_wait_times_seq_next(struct seq_file *p, void *v, loff_t *pos)
+{
+        ++*pos;
+        return NULL;
+}
+static void llite_wait_times_seq_stop(struct seq_file *p, void *v)
+{
+}
+struct seq_operations llite_wait_times_seq_sops = {
+        .start = llite_wait_times_seq_start,
+        .stop = llite_wait_times_seq_stop,
+        .next = llite_wait_times_seq_next,
+        .show = llite_wait_times_seq_show,
+};
+
+static int llite_wait_times_seq_open(struct inode *inode, struct file *file)
+{
+        struct proc_dir_entry *dp = PDE(inode);
+        struct seq_file *seq;
+        int rc;
+
+        rc = seq_open(file, &llite_wait_times_seq_sops);
+        if (rc)
+                return rc;
+        seq = file->private_data;
+        seq->private = dp->data;
+        return 0;
+}
+
+static ssize_t llite_wait_times_seq_write(struct file *file, const char *buf,
+                                       size_t len, loff_t *off)
+{
+        struct seq_file *seq = file->private_data;
+        struct ll_sb_info *sbi = seq->private;
+
+        spin_lock(&sbi->ll_lock);
+        memset(&sbi->ll_read_stime, 0, sizeof(sbi->ll_read_stime));
+        memset(&sbi->ll_write_stime, 0, sizeof(sbi->ll_write_stime));
+        memset(&sbi->ll_grouplock_stime, 0, sizeof(sbi->ll_grouplock_stime));
+        memset(&sbi->ll_seek_stime, 0, sizeof(sbi->ll_seek_stime));
+        memset(&sbi->ll_setattr_stime, 0, sizeof(sbi->ll_setattr_stime));
+        memset(&sbi->ll_brw_stime, 0, sizeof(sbi->ll_brw_stime));
+//        memset(&sbi->ll_done_stime, 0, sizeof(sbi->ll_done_stime));
+        spin_unlock(&sbi->ll_lock);
+
+        return len;
+}
+
+struct file_operations llite_wait_times_fops = {
+        .owner   = THIS_MODULE,
+        .open    = llite_wait_times_seq_open,
+        .read    = seq_read,
+        .write   = llite_wait_times_seq_write,
+        .llseek  = seq_lseek,
+        .release = seq_release,
+};
 
 #endif /* LPROCFS */
diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c
index 7a0619953d..6dd69d1744 100644
--- a/lustre/llite/namei.c
+++ b/lustre/llite/namei.c
@@ -176,8 +176,8 @@ int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
 
                 if (lock->l_resource->lr_name.name[0] != inode->i_ino ||
                     lock->l_resource->lr_name.name[1] != inode->i_generation) {
-                        LDLM_ERROR(lock, "data mismatch with ino %lu/%u",
-                                   inode->i_ino, inode->i_generation);
+                            LDLM_ERROR(lock, "data mismatch with ino %lu/%u(%p)",
+                                   inode->i_ino, inode->i_generation, inode);
                 }
 
                 /* If lookup lock is cancelled, we just drop the dentry and
@@ -189,9 +189,8 @@ int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
                    stat() and similar functions) to renew the data anyway */
                 if (S_ISDIR(inode->i_mode) &&
                     (bits & MDS_INODELOCK_UPDATE)) {
-                        CDEBUG(D_INODE, "invalidating inode %lu\n",
-                               inode->i_ino);
-
+                        CDEBUG(D_INODE, "invalidating inode %lu/%u(%p)\n",
+                               inode->i_ino, inode->i_generation, inode);
                         truncate_inode_pages(inode->i_mapping, 0);
                 }
 
@@ -296,7 +295,6 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
                 if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
                     ll_i2info(inode)->lli_smd != NULL) {
                         struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
-                        struct ost_lvb lvb;
                         ldlm_error_t rc;
 
                         LASSERT(lsm->lsm_object_id != 0);
@@ -304,12 +302,11 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
                         /* bug 2334: drop MDS lock before acquiring OST lock */
                         ll_intent_drop_lock(it);
 
-                        rc = ll_glimpse_size(inode, &lvb);
+                        rc = ll_glimpse_size(inode);
                         if (rc) {
                                 iput(inode);
                                 RETURN(rc);
                         }
-                        inode->i_size = lvb.lvb_size;
                 }
 
                 dentry = *de = ll_find_alias(inode, dentry);
@@ -502,6 +499,24 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, stru
 }
 #endif
 
+static void ll_update_times(struct ptlrpc_request *request, int offset,
+                            struct inode *inode)
+{
+        struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
+                                               sizeof(*body));
+        LASSERT(body);
+
+        if (body->valid & OBD_MD_FLMTIME &&
+            body->mtime > LTIME_S(inode->i_mtime)) {
+                CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
+                       inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
+                LTIME_S(inode->i_mtime) = body->mtime;
+        }
+        if (body->valid & OBD_MD_FLCTIME &&
+            body->ctime > LTIME_S(inode->i_ctime))
+                LTIME_S(inode->i_ctime) = body->ctime;
+}
+
 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
 {
         struct ptlrpc_request *request = NULL;
@@ -532,6 +547,8 @@ static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
                 ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
                 err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                                 current->fsuid, current->fsgid, rdev, &request);
+                if (err == 0)
+                        ll_update_times(request, 0, dir);
                 ptlrpc_req_finished(request);
                 break;
         case S_IFDIR:
@@ -574,6 +591,11 @@ static int ll_mknod(struct inode *dir, struct dentry *child, int mode,
                 ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
                 err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                                 current->fsuid, current->fsgid, rdev, &request);
+                if (err)
+                        GOTO(out_err, err);
+
+                ll_update_times(request, 0, dir);
+                
                 err = ll_prep_inode(sbi->ll_osc_exp, sbi->ll_mdc_exp,
                                     &inode, request, 0, child->d_sb);
                 if (err)
@@ -613,6 +635,9 @@ static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
         err = md_create(sbi->ll_mdc_exp, &op_data,
                         tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
                         current->fsuid, current->fsgid, 0, &request);
+        if (err == 0)
+                ll_update_times(request, 0, dir);
+        
         ptlrpc_req_finished(request);
         RETURN(err);
 }
@@ -635,8 +660,9 @@ static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
 
         ll_prepare_mdc_op_data(&op_data, src, dir, name, len, 0);
         err = md_link(sbi->ll_mdc_exp, &op_data, &request);
+        if (err == 0)
+                ll_update_times(request, 0, dir);
         ptlrpc_req_finished(request);
-
         RETURN(err);
 }
 
@@ -658,6 +684,8 @@ static int ll_mkdir_raw(struct nameidata *nd, int mode)
         ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
         err = md_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                         current->fsuid, current->fsgid, 0, &request);
+        if (err == 0)
+                ll_update_times(request, 0, dir);
         ptlrpc_req_finished(request);
         RETURN(err);
 }
@@ -676,6 +704,8 @@ static int ll_rmdir_raw(struct nameidata *nd)
 
         ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, S_IFDIR);
         rc = md_unlink(ll_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
+        if (rc == 0)
+                ll_update_times(request, 0, dir);
         ptlrpc_req_finished(request);
         RETURN(rc);
 }
@@ -776,9 +806,10 @@ static int ll_unlink_raw(struct nameidata *nd)
         rc = md_unlink(ll_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
         if (rc)
                 GOTO(out, rc);
-
+        ll_update_times(request, 0, dir);
+        
         rc = ll_objects_destroy(request, dir, 2);
- out:
+out:
         ptlrpc_req_finished(request);
         RETURN(rc);
 }
@@ -804,6 +835,8 @@ static int ll_rename_raw(struct nameidata *oldnd, struct nameidata *newnd)
         err = md_rename(sbi->ll_mdc_exp, &op_data,
                         oldname, oldlen, newname, newlen, &request);
         if (!err) {
+                ll_update_times(request, 0, src);
+                ll_update_times(request, 0, tgt);
                 err = ll_objects_destroy(request, src, 3);
         }
 
diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c
index d95dbf56e0..abda07f485 100644
--- a/lustre/llite/rw.c
+++ b/lustre/llite/rw.c
@@ -60,27 +60,30 @@ static int ll_brw(int cmd, struct inode *inode, struct obdo *oa,
 {
         struct ll_inode_info *lli = ll_i2info(inode);
         struct lov_stripe_md *lsm = lli->lli_smd;
+        struct timeval start;
         struct brw_page pg;
         int rc;
         ENTRY;
 
+        do_gettimeofday(&start);
+
         pg.pg = page;
-        pg.off = ((obd_off)page->index) << PAGE_SHIFT;
+        pg.disk_offset = pg.page_offset = ((obd_off)page->index) << PAGE_SHIFT;
 
         if (cmd == OBD_BRW_WRITE &&
-            (pg.off + PAGE_SIZE > inode->i_size))
+            (pg.disk_offset + PAGE_SIZE > inode->i_size))
                 pg.count = inode->i_size % PAGE_SIZE;
         else
                 pg.count = PAGE_SIZE;
 
         CDEBUG(D_PAGE, "%s %d bytes ino %lu at "LPU64"/"LPX64"\n",
                cmd & OBD_BRW_WRITE ? "write" : "read", pg.count, inode->i_ino,
-               pg.off, pg.off);
+               pg.disk_offset, pg.disk_offset);
         if (pg.count == 0) {
                 CERROR("ZERO COUNT: ino %lu: size %p:%Lu(%p:%Lu) idx %lu off "
                        LPU64"\n", inode->i_ino, inode, inode->i_size,
                        page->mapping->host, page->mapping->host->i_size,
-                       page->index, pg.off);
+                       page->index, pg.disk_offset);
         }
 
         pg.flag = flags;
@@ -96,6 +99,8 @@ static int ll_brw(int cmd, struct inode *inode, struct obdo *oa,
                 obdo_to_inode(inode, oa, OBD_MD_FLBLOCKS);
         else if (rc != -EIO)
                 CERROR("error from obd_brw: rc = %d\n", rc);
+        ll_stime_record(ll_i2sbi(inode), &start,
+                        &ll_i2sbi(inode)->ll_brw_stime);
         RETURN(rc);
 }
 
@@ -161,7 +166,7 @@ int ll_prepare_write(struct file *file, struct page *page, unsigned from,
 
         /* Check to see if we should return -EIO right away */
         pga.pg = page;
-        pga.off = offset;
+        pga.disk_offset = pga.page_offset = offset;
         pga.count = PAGE_SIZE;
         pga.flag = 0;
 
@@ -385,7 +390,7 @@ struct ll_async_page *llap_from_page(struct page *page)
         CDEBUG(D_CACHE, "llap %p page %p cookie %p obj off "LPU64"\n", llap,
                page, llap->llap_cookie, (obd_off)page->index << PAGE_SHIFT);
         /* also zeroing the PRIVBITS low order bitflags */
-        page->private = (unsigned long)llap;
+        __set_page_ll_data(page, llap);
         llap->llap_page = page;
 
         spin_lock(&sbi->ll_lock);
@@ -396,10 +401,59 @@ struct ll_async_page *llap_from_page(struct page *page)
         RETURN(llap);
 }
 
+static int queue_or_sync_write(struct obd_export *exp,
+                               struct lov_stripe_md *lsm,
+                               struct ll_async_page *llap,
+                               unsigned to,
+                               obd_flag async_flags)
+{
+        struct obd_io_group *oig;
+        int rc;
+        ENTRY;
+
+        /* _make_ready only sees llap once we've unlocked the page */
+        llap->llap_write_queued = 1;
+        rc = obd_queue_async_io(exp, lsm, NULL, llap->llap_cookie,
+                                OBD_BRW_WRITE, 0, 0, 0, async_flags);
+        if (rc == 0) {
+                LL_CDEBUG_PAGE(D_PAGE, llap->llap_page, "write queued\n");
+                //llap_write_pending(inode, llap);
+                GOTO(out, 0);
+        }
+
+        llap->llap_write_queued = 0;
+
+        rc = oig_init(&oig);
+        if (rc)
+                GOTO(out, rc);
+
+        rc = obd_queue_group_io(exp, lsm, NULL, oig, llap->llap_cookie,
+                                OBD_BRW_WRITE, 0, to, 0, ASYNC_READY |
+                                ASYNC_URGENT | ASYNC_COUNT_STABLE |
+                                ASYNC_GROUP_SYNC);
+        if (rc)
+                GOTO(free_oig, rc);
+
+        rc = obd_trigger_group_io(exp, lsm, NULL, oig);
+        if (rc)
+                GOTO(free_oig, rc);
+
+        rc = oig_wait(oig);
+
+        if (!rc && async_flags & ASYNC_READY)
+                unlock_page(llap->llap_page);
+
+        LL_CDEBUG_PAGE(D_PAGE, llap->llap_page, "sync write returned %d\n",
+                       rc);
+
+free_oig:
+        oig_release(oig);
+out:
+        RETURN(rc);
+}
+
 void lov_increase_kms(struct obd_export *exp, struct lov_stripe_md *lsm,
                       obd_off size);
-/* update our write count to account for i_size increases that may have
- * happened since we've queued the page for io. */
 
 /* be careful not to return success without setting the page Uptodate or
  * the next pass through prepare_write will read in stale data from disk. */
@@ -436,46 +490,20 @@ int ll_commit_write(struct file *file, struct page *page, unsigned from,
                 if (exp == NULL)
                         RETURN(-EINVAL);
 
-                /* _make_ready only sees llap once we've unlocked the page */
-                llap->llap_write_queued = 1;
-                rc = obd_queue_async_io(exp, lsm, NULL, llap->llap_cookie,
-                                        OBD_BRW_WRITE, 0, 0, 0, 0);
-                if (rc != 0) { /* async failed, try sync.. */
-                        struct obd_io_group *oig;
-                        rc = oig_init(&oig);
-                        if (rc)
-                                GOTO(out, rc);
-
-                        llap->llap_write_queued = 0;
-                        rc = obd_queue_group_io(exp, lsm, NULL, oig,
-                                                llap->llap_cookie,
-                                                OBD_BRW_WRITE, 0, to, 0,
-                                                ASYNC_READY | ASYNC_URGENT |
-                                                ASYNC_COUNT_STABLE |
-                                                ASYNC_GROUP_SYNC);
-
-                        if (rc)
-                                GOTO(free_oig, rc);
-
-                        rc = obd_trigger_group_io(exp, lsm, NULL, oig);
-                        if (rc)
-                                GOTO(free_oig, rc);
-
-                        rc = oig_wait(oig);
-free_oig:
-                        oig_release(oig);
+                rc = queue_or_sync_write(exp, ll_i2info(inode)->lli_smd, llap,
+                                         to, 0);
+                if (rc)
                         GOTO(out, rc);
-                }
-                LL_CDEBUG_PAGE(D_PAGE, page, "write queued\n");
-                //llap_write_pending(inode, llap);
         } else {
                 lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats,
                                      LPROC_LL_DIRTY_HITS);
         }
 
         /* put the page in the page cache, from now on ll_removepage is
-         * responsible for cleaning up the llap */
-        set_page_dirty(page);
+         * responsible for cleaning up the llap.
+         * don't dirty the page if it has been write out in q_o_s_w */
+        if (llap->llap_write_queued)
+                set_page_dirty(page);
 
 out:
         if (rc == 0) {
@@ -487,16 +515,54 @@ out:
         }
         RETURN(rc);
 }
+                                                                                                                                                                                                     
+int ll_writepage(struct page *page)
+{
+        struct inode *inode = page->mapping->host;
+        struct obd_export *exp;
+        struct ll_async_page *llap;
+        int rc = 0;
+        ENTRY;
+                                                                                                                                                                                                     
+        LASSERT(!PageDirty(page));
+        LASSERT(PageLocked(page));
+                                                                                                                                                                                                     
+        exp = ll_i2obdexp(inode);
+        if (exp == NULL)
+                GOTO(out, rc = -EINVAL);
+                                                                                                                                                                                                     
+        llap = llap_from_page(page);
+        if (IS_ERR(llap))
+                GOTO(out, rc = PTR_ERR(llap));
+                                                                                                                                                                                                     
+        page_cache_get(page);
+        if (llap->llap_write_queued) {
+                LL_CDEBUG_PAGE(D_PAGE, page, "marking urgent\n");
+                rc = obd_set_async_flags(exp, ll_i2info(inode)->lli_smd, NULL,
+                                         llap->llap_cookie,
+                                         ASYNC_READY | ASYNC_URGENT);
+        } else {
+                rc = queue_or_sync_write(exp, ll_i2info(inode)->lli_smd, llap,
+                                         PAGE_SIZE, ASYNC_READY |
+                                         ASYNC_URGENT);
+        }
+        if (rc)
+                page_cache_release(page);
+out:
+        if (rc)
+                unlock_page(page);
+        RETURN(rc);
+}
 
 static unsigned long ll_ra_count_get(struct ll_sb_info *sbi, unsigned long len)
 {
+        struct ll_ra_info *ra = &sbi->ll_ra_info;
         unsigned long ret;
         ENTRY;
 
         spin_lock(&sbi->ll_lock);
-        ret = min(sbi->ll_max_read_ahead_pages - sbi->ll_read_ahead_pages,
-                  len);
-        sbi->ll_read_ahead_pages += ret;
+        ret = min(ra->ra_max_pages - ra->ra_cur_pages, len);
+        ra->ra_cur_pages += ret;
         spin_unlock(&sbi->ll_lock);
 
         RETURN(ret);
@@ -504,10 +570,11 @@ static unsigned long ll_ra_count_get(struct ll_sb_info *sbi, unsigned long len)
 
 static void ll_ra_count_put(struct ll_sb_info *sbi, unsigned long len)
 {
+        struct ll_ra_info *ra = &sbi->ll_ra_info;
         spin_lock(&sbi->ll_lock);
-        LASSERTF(sbi->ll_read_ahead_pages >= len, "r_a_p %lu len %lu\n",
-                 sbi->ll_read_ahead_pages, len);
-        sbi->ll_read_ahead_pages -= len;
+        LASSERTF(ra->ra_cur_pages >= len, "r_c_p %lu len %lu\n",
+                 ra->ra_cur_pages, len);
+        ra->ra_cur_pages -= len;
         spin_unlock(&sbi->ll_lock);
 }
 
@@ -552,7 +619,10 @@ void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
                 llap_write_complete(page->mapping->host, llap);
                 ll_try_done_writing(page->mapping->host);
         }
-
+        
+        if (PageWriteback(page)) {
+                end_page_writeback(page);
+        }
         page_cache_release(page);
         EXIT;
 }
@@ -604,7 +674,7 @@ void ll_removepage(struct page *page)
 
         /* this unconditional free is only safe because the page lock
          * is providing exclusivity to memory pressure/truncate/writeback..*/
-        page->private = 0;
+        __clear_page_ll_data(page);
 
         spin_lock(&sbi->ll_lock);
         if (!list_empty(&llap->llap_proc_item))
@@ -646,6 +716,7 @@ static int ll_issue_page_read(struct obd_export *exp,
 
         page_cache_get(page);
         llap->llap_defer_uptodate = defer;
+        llap->llap_ra_used = 0;
         rc = obd_queue_group_io(exp, ll_i2info(page->mapping->host)->lli_smd,
                                 NULL, oig, llap->llap_cookie, OBD_BRW_READ, 0,
                                 PAGE_SIZE, 0, ASYNC_COUNT_STABLE | ASYNC_READY
@@ -657,12 +728,55 @@ static int ll_issue_page_read(struct obd_export *exp,
         RETURN(rc);
 }
 
+static void ll_ra_stats_inc_unlocked(struct ll_ra_info *ra, enum ra_stat which)
+{
+        LASSERTF(which >= 0 && which < _NR_RA_STAT, "which: %u\n", which);
+        ra->ra_stats[which]++;
+}
+
+static void ll_ra_stats_inc(struct address_space *mapping, enum ra_stat which)
+{
+        struct ll_sb_info *sbi = ll_i2sbi(mapping->host);
+        struct ll_ra_info *ra = &ll_i2sbi(mapping->host)->ll_ra_info;
+
+        spin_lock(&sbi->ll_lock);
+        ll_ra_stats_inc_unlocked(ra, which);
+        spin_unlock(&sbi->ll_lock);
+}
+
+void ll_ra_accounting(struct page *page, struct address_space *mapping)
+{
+        struct ll_async_page *llap;
+
+        llap = llap_from_page(page);
+        if (IS_ERR(llap))
+                return;
+
+        if (!llap->llap_defer_uptodate || llap->llap_ra_used)
+                return;
+
+        ll_ra_stats_inc(mapping, RA_STAT_DISCARDED);
+}
+
 #define RAS_CDEBUG(ras) \
         CDEBUG(D_READA, "lrp %lu c %lu ws %lu wl %lu nra %lu\n",        \
                ras->ras_last_readpage, ras->ras_consecutive,            \
                ras->ras_window_start, ras->ras_window_len,              \
                ras->ras_next_readahead);
 
+static int index_in_window(unsigned long index, unsigned long point,
+                           unsigned long before, unsigned long after)
+{
+        unsigned long start = point - before, end = point + after;
+
+        if (start > point)
+               start = 0;
+        if (end < point)
+               end = ~0;
+
+        return start <= index && index <= end;
+}
+
 static int ll_readahead(struct ll_readahead_state *ras,
                          struct obd_export *exp, struct address_space *mapping,
                          struct obd_io_group *oig, int flags)
@@ -670,16 +784,18 @@ static int ll_readahead(struct ll_readahead_state *ras,
         unsigned long i, start = 0, end = 0, reserved;
         struct ll_async_page *llap;
         struct page *page;
-        int rc, ret = 0;
+        int rc, ret = 0, match_failed = 0;
         __u64 kms;
         ENTRY;
 
         kms = lov_merge_size(ll_i2info(mapping->host)->lli_smd, 1);
-        if (kms == 0)
+        if (kms == 0) {
+                ll_ra_stats_inc(mapping, RA_STAT_ZERO_LEN);
                 RETURN(0);
-
+        }
         spin_lock(&ras->ras_lock);
 
+        /* reserve a part of the read-ahead window that we'll be issuing */
         if (ras->ras_window_len) {
                 start = ras->ras_next_readahead;
                 end = ras->ras_window_start + ras->ras_window_len - 1;
@@ -691,12 +807,16 @@ static int ll_readahead(struct ll_readahead_state *ras,
 
         spin_unlock(&ras->ras_lock);
 
-        if (end == 0)
+        if (end == 0) {
+                ll_ra_stats_inc(mapping, RA_STAT_ZERO_WINDOW);
                 RETURN(0);
+        }
 
         reserved = ll_ra_count_get(ll_i2sbi(mapping->host), end - start + 1);
+        if (reserved < end - start + 1)
+                ll_ra_stats_inc(mapping, RA_STAT_MAX_IN_FLIGHT);
 
-        for (i = start; reserved > 0 && i <= end; i++) {
+        for (i = start; reserved > 0 && !match_failed && i <= end; i++) {
                 /* skip locked pages from previous readpage calls */
                 page = grab_cache_page_nowait(mapping, i);
                 if (page == NULL) {
@@ -718,7 +838,8 @@ static int ll_readahead(struct ll_readahead_state *ras,
                 if ((rc = ll_page_matches(page, flags)) <= 0) {
                         LL_CDEBUG_PAGE(D_READA | D_PAGE, page,
                                        "lock match failed: rc %d\n", rc);
-                        i = end;
+                        ll_ra_stats_inc(mapping, RA_STAT_FAILED_MATCH);
+                        match_failed = 1;
                         goto next_page;
                 }
 
@@ -742,20 +863,36 @@ static int ll_readahead(struct ll_readahead_state *ras,
         LASSERTF(reserved >= 0, "reserved %lu\n", reserved);
         if (reserved != 0)
                 ll_ra_count_put(ll_i2sbi(mapping->host), reserved);
+
+        if (i == end + 1 && end == (kms >> PAGE_CACHE_SHIFT))
+                ll_ra_stats_inc(mapping, RA_STAT_EOF);
+
+        /* if we didn't get to the end of the region we reserved from
+         * the ras we need to go back and update the ras so that the
+         * next read-ahead tries from where we left off.  we only do so
+         * if the region we failed to issue read-ahead on is still ahead
+         * of the app and behind the next index to start read-ahead from */
+        if (i != end + 1) {
+                spin_lock(&ras->ras_lock);
+                if (i < ras->ras_next_readahead &&
+                    index_in_window(i, ras->ras_window_start, 0,
+                                    ras->ras_window_len)) {
+                        ras->ras_next_readahead = i;
+                        RAS_CDEBUG(ras);
+                }
+                spin_unlock(&ras->ras_lock);
+        }
+
         RETURN(ret);
 }
 
-static void ras_set_start(struct ll_readahead_state *ras,
-                               unsigned long index)
+static void ras_set_start(struct ll_readahead_state *ras, unsigned long index)
 {
         ras->ras_window_start = index & (~(PTLRPC_MAX_BRW_PAGES - 1));
-        ras->ras_next_readahead = max(ras->ras_window_start,
-                                      ras->ras_next_readahead);
 }
 
 /* called with the ras_lock held or from places where it doesn't matter */
-static void ras_reset(struct ll_readahead_state *ras,
-                      unsigned long index)
+static void ras_reset(struct ll_readahead_state *ras, unsigned long index)
 {
         ras->ras_last_readpage = index;
         ras->ras_consecutive = 1;
@@ -772,14 +909,35 @@ void ll_readahead_init(struct inode *inode, struct ll_readahead_state *ras)
         ras_reset(ras, 0);
 }
 
-static void ras_update(struct ll_readahead_state *ras,
-                       unsigned long index, unsigned long max)
+static void ras_update(struct ll_sb_info *sbi, struct ll_readahead_state *ras,
+                       unsigned long index, unsigned hit)
 {
+        struct ll_ra_info *ra = &sbi->ll_ra_info;
+        int zero = 0;
         ENTRY;
 
+        spin_lock(&sbi->ll_lock);
         spin_lock(&ras->ras_lock);
+        
+        ll_ra_stats_inc_unlocked(ra, hit ? RA_STAT_HIT : RA_STAT_MISS);
+
+        /* reset the read-ahead window in two cases.  First when the app seeks
+         * or reads to some other part of the file.  Secondly if we get a
+         * read-ahead miss that we think we've previously issued.  This can
+         * be a symptom of there being so many read-ahead pages that the VM is
+         * reclaiming it before we get to it. */
+        if (!index_in_window(index, ras->ras_last_readpage, 8, 8)) {
+                zero = 1;
+                ll_ra_stats_inc_unlocked(ra, RA_STAT_DISTANT_READPAGE);
+        } else if (!hit && ras->ras_window_len &&
+                   index < ras->ras_next_readahead &&
+                   index_in_window(index, ras->ras_window_start, 0,
+                                   ras->ras_window_len)) {
+                zero = 1;
+                ll_ra_stats_inc_unlocked(ra, RA_STAT_MISS_IN_WINDOW);
+        }
 
-        if (index != ras->ras_last_readpage + 1) {
+        if (zero) {
                 ras_reset(ras, index);
                 GOTO(out_unlock, 0);
         }
@@ -787,8 +945,12 @@ static void ras_update(struct ll_readahead_state *ras,
         ras->ras_last_readpage = index;
         ras->ras_consecutive++;
         ras_set_start(ras, index);
+        ras->ras_next_readahead = max(ras->ras_window_start,
+                                      ras->ras_next_readahead);
 
-        if (ras->ras_consecutive == 2) {
+        /* wait for a few pages to arrive before issuing readahead to avoid
+         * the worst overutilization */
+        if (ras->ras_consecutive == 3) {
                 ras->ras_window_len = PTLRPC_MAX_BRW_PAGES;
                 GOTO(out_unlock, 0);
         }
@@ -798,13 +960,16 @@ static void ras_update(struct ll_readahead_state *ras,
         if ((index & (PTLRPC_MAX_BRW_PAGES - 1)) == 
             (PTLRPC_MAX_BRW_PAGES >> 1)) {
                 ras->ras_window_len += PTLRPC_MAX_BRW_PAGES;
-                ras->ras_window_len = min(ras->ras_window_len, max);
+                ras->ras_window_len = min(ras->ras_window_len,
+                                          ra->ra_max_pages);
+
         }
 
         EXIT;
 out_unlock:
         RAS_CDEBUG(ras);
         spin_unlock(&ras->ras_lock);
+        spin_unlock(&sbi->ll_lock);
         return;
 }
 
@@ -847,10 +1012,11 @@ int ll_readpage(struct file *filp, struct page *page)
                 GOTO(out, rc = PTR_ERR(llap));
 
         if (ll_i2sbi(inode)->ll_flags & LL_SBI_READAHEAD)
-                ras_update(&fd->fd_ras, page->index, 
-                           ll_i2sbi(inode)->ll_max_read_ahead_pages);
-
+                ras_update(ll_i2sbi(inode), &fd->fd_ras, page->index,
+                           llap->llap_defer_uptodate);
+        
         if (llap->llap_defer_uptodate) {
+                llap->llap_ra_used = 1;
                 rc = ll_readahead(&fd->fd_ras, exp, page->mapping, oig,
                                   fd->fd_flags);
                 if (rc > 0)
@@ -869,17 +1035,10 @@ int ll_readpage(struct file *filp, struct page *page)
         }
 
         if (rc == 0) {
-                static unsigned long next_print;
-                CDEBUG(D_INODE, "ino %lu page %lu (%llu) didn't match a lock\n",
-                       inode->i_ino, page->index,
-                       (long long)page->index << PAGE_CACHE_SHIFT);
-                if (time_after(jiffies, next_print)) {
-                        CWARN("ino %lu page %lu (%llu) not covered by "
-                               "a lock (mmap?).  check debug logs.\n",
-                               inode->i_ino, page->index,
-                               (long long)page->index << PAGE_CACHE_SHIFT);
-                        next_print = jiffies + 30 * HZ;
-                }
+                CWARN("ino %lu page %lu (%llu) not covered by "
+                      "a lock (mmap?).  check debug logs.\n",
+                      inode->i_ino, page->index,
+                      (long long)page->index << PAGE_CACHE_SHIFT);
         }
 
         rc = ll_issue_page_read(exp, llap, oig, 0);
diff --git a/lustre/llite/rw24.c b/lustre/llite/rw24.c
index fb6dee4a21..df040c5f9f 100644
--- a/lustre/llite/rw24.c
+++ b/lustre/llite/rw24.c
@@ -49,49 +49,6 @@
 #include "llite_internal.h"
 #include <linux/lustre_compat25.h>
 
-static int ll_writepage_24(struct page *page)
-{
-        struct inode *inode = page->mapping->host;
-        struct obd_export *exp;
-        struct ll_async_page *llap;
-        int rc = 0;
-        ENTRY;
-
-        LASSERT(!PageDirty(page));
-        LASSERT(PageLocked(page));
-
-        exp = ll_i2obdexp(inode);
-        if (exp == NULL)
-                GOTO(out, rc = -EINVAL);
-
-        llap = llap_from_page(page);
-        if (IS_ERR(llap))
-                GOTO(out, rc = PTR_ERR(llap));
-
-        page_cache_get(page);
-        if (llap->llap_write_queued) {
-                LL_CDEBUG_PAGE(D_PAGE, page, "marking urgent\n");
-                rc = obd_set_async_flags(exp, ll_i2info(inode)->lli_smd, NULL,
-                                         llap->llap_cookie,
-                                         ASYNC_READY | ASYNC_URGENT);
-        } else {
-                llap->llap_write_queued = 1;
-                rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL,
-                                        llap->llap_cookie, OBD_BRW_WRITE, 0, 0,
-                                        0, ASYNC_READY | ASYNC_URGENT);
-                if (rc == 0)
-                        LL_CDEBUG_PAGE(D_PAGE, page, "mmap write queued\n");
-                else
-                        llap->llap_write_queued = 0;
-        }
-        if (rc)
-                page_cache_release(page);
-out:
-        if (rc)
-                unlock_page(page);
-        RETURN(rc);
-}
-
 static int ll_direct_IO_24(int rw,
 #ifdef HAVE_DIO_FILE
                            struct file *file,
@@ -129,14 +86,15 @@ static int ll_direct_IO_24(int rw,
         flags = 0 /* | OBD_BRW_DIRECTIO */;
         offset = ((obd_off)blocknr * blocksize);
         length = iobuf->length;
+        pga[0].page_offset = iobuf->offset;
         LASSERT(iobuf->offset < PAGE_SIZE);
 
         for (i = 0, length = iobuf->length; length > 0;
              length -= pga[i].count, offset += pga[i].count, i++) { /*i last!*/
                 pga[i].pg = iobuf->maplist[i];
-                pga[i].off = offset;
+                pga[i].disk_offset = offset;
                 /* To the end of the page, or the length, whatever is less */
-                pga[i].count = min_t(int, PAGE_SIZE - (offset & ~PAGE_MASK),
+                pga[i].count = min_t(int, PAGE_SIZE - pga[i].page_offset,
                                      length);
                 pga[i].flag = flags;
                 if (rw == READ)
@@ -183,7 +141,7 @@ static int ll_direct_IO_24(int rw,
 struct address_space_operations ll_aops = {
         .readpage       = ll_readpage,
         .direct_IO      = ll_direct_IO_24,
-        .writepage      = ll_writepage_24,
+        .writepage      = ll_writepage,
         .prepare_write  = ll_prepare_write,
         .commit_write   = ll_commit_write,
         .removepage     = ll_removepage,
diff --git a/lustre/llite/rw26.c b/lustre/llite/rw26.c
index b9193e8722..07b0d45379 100644
--- a/lustre/llite/rw26.c
+++ b/lustre/llite/rw26.c
@@ -53,45 +53,24 @@
 
 static int ll_writepage_26(struct page *page, struct writeback_control *wbc)
 {
-        struct inode *inode = page->mapping->host;
-        struct obd_export *exp;
-        struct ll_async_page *llap;
-        int rc;
-        ENTRY;
-
-        LASSERT(!PageDirty(page));
-        LASSERT(PageLocked(page));
-
-        exp = ll_i2obdexp(inode);
-        if (exp == NULL)
-                GOTO(out, rc = -EINVAL);
+        return ll_writepage(page);
+}
 
-        llap = llap_from_page(page);
-        if (IS_ERR(llap))
-                GOTO(out, rc = PTR_ERR(llap));
+/* It is safe to not check anything in invalidatepage/releasepage below
+   because they are run with page locked and all our io is happening with
+   locked page too */
+static int ll_invalidatepage(struct page *page, unsigned long offset)
+{
+        if (PagePrivate(page))
+                ll_removepage(page);
+        return 1;
+}
 
-        page_cache_get(page);
-        if (llap->llap_write_queued) {
-                LL_CDEBUG_PAGE(D_PAGE, page, "marking urgent\n");
-                rc = obd_set_async_flags(exp, ll_i2info(inode)->lli_smd, NULL,
-                                         llap->llap_cookie,
-                                         ASYNC_READY | ASYNC_URGENT);
-        } else {
-                llap->llap_write_queued = 1;
-                rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL,
-                                        llap->llap_cookie, OBD_BRW_WRITE, 0, 0,
-                                        0, ASYNC_READY | ASYNC_URGENT);
-                if (rc == 0)
-                        LL_CDEBUG_PAGE(D_PAGE, page, "mmap write queued\n");
-                else
-                        llap->llap_write_queued = 0;
-        }
-        if (rc)
-                page_cache_release(page);
-out:
-        if (rc)
-                unlock_page(page);
-        RETURN(rc);
+static int ll_releasepage(struct page *page, int gfp_mask)
+{
+        if (PagePrivate(page))
+                ll_removepage(page);
+        return 1;
 }
 
 struct address_space_operations ll_aops = {
@@ -104,6 +83,7 @@ struct address_space_operations ll_aops = {
         .sync_page      = NULL,
         .prepare_write  = ll_prepare_write,
         .commit_write   = ll_commit_write,
-        .removepage     = ll_removepage,
+        .invalidatepage = ll_invalidatepage,
+        .releasepage    = ll_releasepage,
         .bmap           = NULL
 };
diff --git a/lustre/llite/super.c b/lustre/llite/super.c
index 87fd9b6758..4e7db603ff 100644
--- a/lustre/llite/super.c
+++ b/lustre/llite/super.c
@@ -34,6 +34,7 @@
 #include <linux/fs.h>
 #include <linux/lprocfs_status.h>
 #include "llite_internal.h"
+#include <lustre/lustre_user.h>
 
 extern struct address_space_operations ll_aops;
 extern struct address_space_operations ll_dir_aops;
@@ -146,7 +147,8 @@ static void __exit exit_lustre_lite(void)
 
         ll_gns_stop_thread();
 
-        kmem_cache_destroy(ll_file_data_slab);
+        LASSERTF(kmem_cache_destroy(ll_file_data_slab) == 0,
+                 "couldn't destroy ll_file_data slab\n");
 
         if (proc_lustre_fs_root) {
                 lprocfs_remove(proc_lustre_fs_root);
diff --git a/lustre/llite/super25.c b/lustre/llite/super25.c
index 1f5425ec2f..81bb12f55d 100644
--- a/lustre/llite/super25.c
+++ b/lustre/llite/super25.c
@@ -93,8 +93,8 @@ int ll_init_inodecache(void)
 
 void ll_destroy_inodecache(void)
 {
-        if (kmem_cache_destroy(ll_inode_cachep))
-                CERROR("ll_inode_cache: not all structures were freed\n");
+        LASSERTF(kmem_cache_destroy(ll_inode_cachep) == 0,
+                 "ll_inode_cache: not all structures were freed\n");
 }
 
 /* exported operations */
@@ -127,7 +127,8 @@ struct file_system_type lustre_fs_type = {
 
 static int __init init_lustre_lite(void)
 {
-        int rc;
+        int rc, cleanup = 0;
+
         printk(KERN_INFO "Lustre: Lustre Lite Client File System; "
                "info@clusterfs.com\n");
         rc = ll_init_inodecache();
@@ -137,7 +138,7 @@ static int __init init_lustre_lite(void)
                                               sizeof(struct ll_file_data), 0,
                                               SLAB_HWCACHE_ALIGN, NULL, NULL);
         if (ll_file_data_slab == NULL) {
-                ll_destroy_inodecache();
+                GOTO(out, rc = ENOMEM);
                 return -ENOMEM;
         }
 
@@ -145,10 +146,28 @@ static int __init init_lustre_lite(void)
                               proc_mkdir("llite", proc_lustre_root) : NULL;
 
         rc = register_filesystem(&lustre_lite_fs_type);
-        if (!rc) {
-                rc = register_filesystem(&lustre_fs_type);
-                if (rc)
-                        unregister_filesystem(&lustre_fs_type);
+        if (rc)
+                GOTO(out, rc);
+        cleanup = 1;
+
+        rc = register_filesystem(&lustre_fs_type);
+        if (rc)
+                GOTO(out, rc);
+        cleanup = 2;
+
+        rc = ll_gns_start_thread();
+        if (rc)
+                GOTO(out, rc);
+        return 0;
+
+out:
+        switch (cleanup) {
+        case 2:
+                unregister_filesystem(&lustre_fs_type);
+        case 1:
+                unregister_filesystem(&lustre_lite_fs_type);
+        case 0:
+               ll_destroy_inodecache();
         }
         return rc;
 }
@@ -158,7 +177,9 @@ static void __exit exit_lustre_lite(void)
         unregister_filesystem(&lustre_fs_type);
         unregister_filesystem(&lustre_lite_fs_type);
         ll_destroy_inodecache();
-        kmem_cache_destroy(ll_file_data_slab);
+        
+        LASSERTF(kmem_cache_destroy(ll_file_data_slab) == 0,
+                 "couldn't destroy ll_file_data slab\n");
         if (proc_lustre_fs_root) {
                 lprocfs_remove(proc_lustre_fs_root);
                 proc_lustre_fs_root = NULL;
diff --git a/lustre/llite/symlink.c b/lustre/llite/symlink.c
index 2ca36deef2..5f4a74c269 100644
--- a/lustre/llite/symlink.c
+++ b/lustre/llite/symlink.c
@@ -51,7 +51,8 @@ static int ll_readlink_internal(struct inode *inode,
         rc = md_getattr(sbi->ll_mdc_exp, &fid, OBD_MD_LINKNAME, symlen,
                         request);
         if (rc) {
-                CERROR("inode %lu: rc = %d\n", inode->i_ino, rc);
+                if (rc != -ENOENT)
+                        CERROR("inode %lu: rc = %d\n", inode->i_ino, rc);
                 RETURN(rc);
         }
 
diff --git a/lustre/lmv/lmv_intent.c b/lustre/lmv/lmv_intent.c
index 23730d3272..baea244b5d 100644
--- a/lustre/lmv/lmv_intent.c
+++ b/lustre/lmv/lmv_intent.c
@@ -246,59 +246,57 @@ int lmv_intent_getattr(struct obd_export *exp,
                 if (obj) {
                         /* in fact, we need not this with current intent_lock(),
                          * but it may change some day */
+                        if (!fid_equal(pfid, cfid)){
+                                rpfid = obj->objs[mds].fid;
+                                mds = rpfid.mds;
+                        }
+                        lmv_put_obj(obj);
+               }
+        } else {
+                CDEBUG(D_OTHER, "INTENT getattr for %*s on %lu/%lu/%lu\n",
+                       len, name, (unsigned long)pfid->mds, (unsigned long)pfid->id,
+                       (unsigned long)pfid->generation);
+                mds = pfid->mds;
+                obj = lmv_grab_obj(obd, pfid);
+                if (obj && len) {
+                        /* directory is already splitted. calculate mds */
+                        mds = raw_name2idx(obj->hashtype, obj->objcount, (char *) name, len);
                         rpfid = obj->objs[mds].fid;
                         mds = rpfid.mds;
                         lmv_put_obj(obj);
-                }
-                rc = md_intent_lock(lmv->tgts[mds].ltd_exp, &rpfid, name,
-                                    len, lmm, lmmsize, cfid, it, flags, reqp,
-                                    cb_blocking);
-                if (obj && rc >= 0) {
-                        /* this is splitted dir. In order to optimize things a
-                         * bit, we consider obj valid updating missing parts.
-
-                         * FIXME: do we need to return any lock here? It would
-                         * be fine if we don't. this means that nobody should
-                         * use UPDATE lock to notify about object * removal */
-                        CDEBUG(D_OTHER,
-                               "revalidate slaves for %lu/%lu/%lu, rc %d\n",
-                               (unsigned long)cfid->mds, (unsigned long)cfid->id,
-                               (unsigned long)cfid->generation, rc);
-                        
-                        rc = lmv_revalidate_slaves(exp, reqp, cfid, it, rc,
-                                                   cb_blocking);
-                }
 
-                RETURN(rc);                
-        }
-
-        CDEBUG(D_OTHER, "INTENT getattr for %*s on %lu/%lu/%lu\n",
-               len, name, (unsigned long)pfid->mds, (unsigned long)pfid->id,
-               (unsigned long)pfid->generation);
-
-        mds = pfid->mds;
-        obj = lmv_grab_obj(obd, pfid);
-        if (obj && len) {
-                /* directory is already splitted. calculate mds */
-                mds = raw_name2idx(obj->hashtype, obj->objcount, (char *) name, len);
-                rpfid = obj->objs[mds].fid;
-                mds = rpfid.mds;
-                lmv_put_obj(obj);
-                
-                CDEBUG(D_OTHER, "forward to MDS #%u (slave %lu/%lu/%lu)\n",
-                       mds, (unsigned long)rpfid.mds, (unsigned long)rpfid.id,
-                       (unsigned long)rpfid.generation);
-        }
-        
+                        CDEBUG(D_OTHER, "forward to MDS #%u (slave %lu/%lu/%lu)\n",
+                               mds, (unsigned long)rpfid.mds, (unsigned long)rpfid.id,
+                               (unsigned long)rpfid.generation);
+                }
+        } 
         rc = md_intent_lock(lmv->tgts[mds].ltd_exp, &rpfid, name,
-                            len, lmm, lmmsize, NULL, it, flags, reqp,
+                            len, lmm, lmmsize, cfid, it, flags, reqp,
                             cb_blocking);
-        
         if (rc < 0)
                 RETURN(rc);
-        
-        LASSERT(rc == 0);
+       
+        if (obj && rc > 0) {
+                /* this is splitted dir. In order to optimize things a
+                 * bit, we consider obj valid updating missing parts.
+
+                 * FIXME: do we need to return any lock here? It would
+                 * be fine if we don't. this means that nobody should
+                 * use UPDATE lock to notify about object * removal */
+                CDEBUG(D_OTHER,
+                       "revalidate slaves for %lu/%lu/%lu, rc %d\n",
+                       (unsigned long)cfid->mds, (unsigned long)cfid->id,
+                       (unsigned long)cfid->generation, rc);
+                
+                LASSERT(cfid != 0);
+                rc = lmv_revalidate_slaves(exp, reqp, cfid, it, rc,
+                                           cb_blocking);
+                RETURN(rc);                
+        }
 
+        if (*reqp == NULL)
+                RETURN(rc);
+ 
         /* okay, MDS has returned success. probably name has been
          * resolved in remote inode */
         rc = lmv_handle_remote_inode(exp, lmm, lmmsize, it,
@@ -403,31 +401,13 @@ int lmv_lookup_slaves(struct obd_export *exp, struct ptlrpc_request **reqp)
                                     lmv_dirobj_blocking_ast);
                 
                 lockh = (struct lustre_handle *)&it.d.lustre.it_lock_handle;
-                if (rc > 0) {
+                if (rc > 0 && req == NULL) {
                         /* nice, this slave is valid */
                         LASSERT(req == NULL);
                         CDEBUG(D_OTHER, "cached\n");
                         goto release_lock;
                 }
 
-                if (rc < 0)
-                        /* error during revalidation */
-                        GOTO(cleanup, rc);
-
-                /* rc == 0, this means we have no such a lock and can't think
-                 * obj is still valid. lookup it again */
-                LASSERT(req == NULL);
-                req = NULL;
-
-                memset(&it, 0, sizeof(it));
-                it.it_op = IT_GETATTR;
-                rc = md_intent_lock(lmv->tgts[fid.mds].ltd_exp, &fid,
-                                    NULL, 0, NULL, 0, NULL, &it, 0, &req,
-                                    lmv_dirobj_blocking_ast);
-
-                lockh = (struct lustre_handle *) &it.d.lustre.it_lock_handle;
-                LASSERT(rc <= 0);
-
                 if (rc < 0)
                         /* error during lookup */
                         GOTO(cleanup, rc);
@@ -488,7 +468,8 @@ int lmv_intent_lookup(struct obd_export *exp,
                 rpfid = *pfid;
                 obj = lmv_grab_obj(obd, pfid);
                 if (obj) {
-                        mds = raw_name2idx(obj->hashtype, obj->objcount, (char *) name, len);
+                        mds = raw_name2idx(obj->hashtype, obj->objcount, 
+                                           (char *) name, len);
                         rpfid = obj->objs[mds].fid;
                         lmv_put_obj(obj);
                 }
@@ -498,36 +479,37 @@ int lmv_intent_lookup(struct obd_export *exp,
                        (unsigned long)cfid->mds, (unsigned long)cfid->id,
                        (unsigned long)cfid->generation, mds);
 
-                rc = md_intent_lock(lmv->tgts[mds].ltd_exp, pfid, name,
-                                    len, lmm, lmmsize, cfid, it, flags,
-                                    reqp, cb_blocking);
-                RETURN(rc);
-        }
-
-        mds = pfid->mds;
+        } else {
+                mds = pfid->mds;
 repeat:
-        LASSERT(++loop <= 2);
-        /* this is lookup. during lookup we have to update all the attributes,
-         * because returned values will be put in struct inode */
+                LASSERT(++loop <= 2);
+                /* this is lookup. during lookup we have to update all the 
+                 * attributes, because returned values will be put in struct 
+                 * inode */
 
-        obj = lmv_grab_obj(obd, pfid);
-        if (obj) {
-                if (len) {
-                        /* directory is already splitted. calculate mds */
-                        mds = raw_name2idx(obj->hashtype, obj->objcount, (char *)name, len);
-                        rpfid = obj->objs[mds].fid;
-                        mds = rpfid.mds;
+                obj = lmv_grab_obj(obd, pfid);
+                if (obj) {
+                        if (len) {
+                                /* directory is already splitted. calculate mds */
+                                mds = raw_name2idx(obj->hashtype, obj->objcount, 
+                                                   (char *)name, len);
+                                rpfid = obj->objs[mds].fid;
+                                mds = rpfid.mds;
+                        }
+                        lmv_put_obj(obj);
                 }
-                lmv_put_obj(obj);
         }
-
-        rc = md_intent_lock(lmv->tgts[mds].ltd_exp, &rpfid, name,
-                            len, lmm, lmmsize, NULL, it, flags, reqp,
+        rc = md_intent_lock(lmv->tgts[mds].ltd_exp, pfid, name,
+                            len, lmm, lmmsize, cfid, it, flags, reqp, 
                             cb_blocking);
+        if (rc > 0) {
+                LASSERT(cfid != 0);
+                RETURN(rc);
+        }
         if (rc > 0) {
                 /* very interesting. it seems object is still valid but for some
                  * reason llite calls lookup, not revalidate */
-                CWARN("lookup for %lu/%lu/%lu and data should be uptodate\n",
+                CDEBUG(D_OTHER, "lookup for %lu/%lu/%lu and data should be uptodate\n",
                       (unsigned long)rpfid.mds, (unsigned long)rpfid.id,
                       (unsigned long)rpfid.generation);
                 LASSERT(*reqp == NULL);
@@ -536,9 +518,9 @@ repeat:
 
         if (rc == 0 && *reqp == NULL) {
                 /* once again, we're asked for lookup, not revalidate */
-                CWARN("lookup for %lu/%lu/%lu and data should be uptodate\n",
-                       (unsigned long)rpfid.mds, (unsigned long)rpfid.id,
-                       (unsigned long)rpfid.generation);
+                CDEBUG(D_OTHER, "lookup for %lu/%lu/%lu and data should be uptodate\n",
+                      (unsigned long)rpfid.mds, (unsigned long)rpfid.id,
+                      (unsigned long)rpfid.generation);
                 RETURN(rc);
         }
        
@@ -689,7 +671,7 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct ptlrpc_request **reqp,
                 rc = md_intent_lock(lmv->tgts[fid.mds].ltd_exp, &fid,
                                     NULL, 0, NULL, 0, &fid, &it, 0, &req, cb);
                 lockh = (struct lustre_handle *) &it.d.lustre.it_lock_handle;
-                if (rc > 0) {
+                if (rc > 0 && req == NULL) {
                         /* nice, this slave is valid */
                         LASSERT(req == NULL);
                         CDEBUG(D_OTHER, "cached\n");
@@ -700,22 +682,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct ptlrpc_request **reqp,
                         /* error during revalidation */
                         GOTO(cleanup, rc);
 
-                /* rc == 0, this means we have no such a lock and can't think
-                 * obj is still valid. lookup it again */
-                LASSERT(req == NULL);
-                req = NULL;
-                
-                memset(&it, 0, sizeof(it));
-                it.it_op = IT_GETATTR;
-                rc = md_intent_lock(lmv->tgts[fid.mds].ltd_exp, &fid,
-                                    NULL, 0, NULL, 0, NULL, &it, 0, &req, cb);
-                lockh = (struct lustre_handle *) &it.d.lustre.it_lock_handle;
-                LASSERT(rc <= 0);
-
-                if (rc < 0)
-                        /* error during lookup */
-                        GOTO(cleanup, rc);
-              
                 if (master) {
                         LASSERT(master_valid == 0);
                         /* save lock on master to be returned to the caller */
diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c
index 1cb4e0afc9..286b031e11 100644
--- a/lustre/lmv/lmv_obd.c
+++ b/lustre/lmv/lmv_obd.c
@@ -406,7 +406,6 @@ static int lmv_disconnect(struct obd_export *exp, int flags)
                                        mdc_obd->obd_name);
                         }
                 }
-
                 if (obd->obd_no_recov) {
                         /* Pass it on to our clients.
                          * XXX This should be an argument to disconnect,
@@ -417,7 +416,6 @@ static int lmv_disconnect(struct obd_export *exp, int flags)
                         if (mdc_obd)
                                 mdc_obd->obd_no_recov = 1;
                 }
-
                 CDEBUG(D_OTHER, "disconnected from %s(%s) successfully\n",
                         lmv->tgts[i].ltd_exp->exp_obd->obd_name,
                         lmv->tgts[i].ltd_exp->exp_obd->obd_uuid.uuid);
@@ -1135,7 +1133,7 @@ int lmv_rename(struct obd_export *exp, struct mdc_op_data *data,
                (unsigned long) data->fid2.generation);
         
         if (!fid_equal(&data->fid1, &data->fid2))
-                CWARN("cross-node rename %lu/%lu/%lu:%*s to %lu/%lu/%lu:%*s\n",
+                CDEBUG(D_OTHER, "cross-node rename %lu/%lu/%lu:%*s to %lu/%lu/%lu:%*s\n",
                       (unsigned long)data->fid1.mds,
                       (unsigned long)data->fid1.id,
                       (unsigned long)data->fid1.generation, oldlen, old,
diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c
index c5147ba334..fb34c8b976 100644
--- a/lustre/lov/lov_obd.c
+++ b/lustre/lov/lov_obd.c
@@ -365,7 +365,6 @@ static int lov_disconnect(struct obd_export *exp, int flags)
 static int lov_set_osc_active(struct lov_obd *lov, struct obd_uuid *uuid,
                               int activate)
 {
-        struct obd_device *obd;
         struct lov_tgt_desc *tgt;
         int i, rc = 0;
         ENTRY;
@@ -384,24 +383,15 @@ static int lov_set_osc_active(struct lov_obd *lov, struct obd_uuid *uuid,
         if (i == lov->desc.ld_tgt_count)
                 GOTO(out, rc = -EINVAL);
 
-        obd = class_exp2obd(tgt->ltd_exp);
-        if (obd == NULL) {
-                /* This can happen if OST failure races with node shutdown */
-                GOTO(out, rc = -ENOTCONN);
-        }
-
-        CDEBUG(D_INFO, "Found OBD %s=%s device %d (%p) type %s at LOV idx %d\n",
-               obd->obd_name, obd->obd_uuid.uuid, obd->obd_minor, obd,
-               obd->obd_type->typ_name, i);
-        LASSERT(strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME) == 0);
 
         if (tgt->active == activate) {
-                CDEBUG(D_INFO, "OBD %p already %sactive!\n", obd,
-                       activate ? "" : "in");
+                CDEBUG(D_INFO, "OSC %s already %sactive!\n", uuid->uuid,                       
+                        activate ? "" : "in");
                 GOTO(out, rc);
         }
 
-        CDEBUG(D_INFO, "Marking OBD %p %sactive\n", obd, activate ? "" : "in");
+        CDEBUG(D_INFO, "Marking OSC %s %sactive\n", uuid->uuid,
+               activate ? "" : "in");
 
         tgt->active = activate;
         if (activate)
@@ -483,32 +473,35 @@ static int lov_setup(struct obd_device *obd, obd_count len, void *buf)
         struct lov_obd *lov = &obd->u.lov;
         int count;
         ENTRY;
-
+                                                                                                                                                                                                     
         if (lcfg->lcfg_inllen1 < 1) {
                 CERROR("LOV setup requires a descriptor\n");
                 RETURN(-EINVAL);
         }
-
+                                                                                                                                                                                                     
         desc = (struct lov_desc *)lcfg->lcfg_inlbuf1;
         if (sizeof(*desc) > lcfg->lcfg_inllen1) {
                 CERROR("descriptor size wrong: %d > %d\n",
                        (int)sizeof(*desc), lcfg->lcfg_inllen1);
                 RETURN(-EINVAL);
         }
-
+ 
         /* Because of 64-bit divide/mod operations only work with a 32-bit
          * divisor in a 32-bit kernel, we cannot support a stripe width
          * of 4GB or larger on 32-bit CPUs.
          */
-
+       
         count = desc->ld_default_stripe_count;
         if (count && (count * desc->ld_default_stripe_size) > ~0UL) {
                 CERROR("LOV: stripe width "LPU64"x%u > %lu on 32-bit system\n",
                        desc->ld_default_stripe_size, count, ~0UL);
                 RETURN(-EINVAL);
         }
-
-        lov->bufsize = LOV_MAX_TGT_COUNT * sizeof(struct lov_tgt_desc);
+        if (desc->ld_tgt_count > 0) {
+                lov->bufsize= sizeof(struct lov_tgt_desc) * desc->ld_tgt_count;
+        } else {
+                lov->bufsize = sizeof(struct lov_tgt_desc) * LOV_MAX_TGT_COUNT;  
+        }
         OBD_ALLOC(lov->tgts, lov->bufsize);
         if (lov->tgts == NULL) {
                 lov->bufsize = 0;
@@ -516,13 +509,13 @@ static int lov_setup(struct obd_device *obd, obd_count len, void *buf)
                        lov->bufsize);
                 RETURN(-EINVAL);
         }
-
+                                                                                                                                                                                                     
         desc->ld_tgt_count = 0;
         desc->ld_active_tgt_count = 0;
         lov->desc = *desc;
         spin_lock_init(&lov->lov_lock);
         sema_init(&lov->lov_llog_sem, 1);
-
+                                                                                                                                                                                                     
         RETURN(0);
 }
 
@@ -1825,12 +1818,12 @@ static int lov_brw_check(struct lov_obd *lov, struct obdo *oa,
         /* The caller just wants to know if there's a chance that this
          * I/O can succeed */
         for (i = 0; i < oa_bufs; i++) {
-                int stripe = lov_stripe_number(lsm, pga[i].off);
+                int stripe = lov_stripe_number(lsm, pga[i].disk_offset);
                 int ost = lsm->lsm_oinfo[stripe].loi_ost_idx;
                 obd_off start, end;
 
-                if (!lov_stripe_intersects(lsm, i, pga[i].off,
-                                           pga[i].off + pga[i].count,
+                if (!lov_stripe_intersects(lsm, i, pga[i].disk_offset,
+                                           pga[i].disk_offset + pga[i].count,
                                            &start, &end))
                         continue;
 
@@ -1897,7 +1890,7 @@ static int lov_brw(int cmd, struct obd_export *exp, struct obdo *src_oa,
         }
 
         for (i = 0; i < oa_bufs; i++) {
-                where[i] = lov_stripe_number(lsm, pga[i].off);
+                where[i] = lov_stripe_number(lsm, pga[i].disk_offset);
                 stripeinfo[where[i]].bufct++;
         }
 
@@ -1917,8 +1910,8 @@ static int lov_brw(int cmd, struct obd_export *exp, struct obdo *src_oa,
                 shift = stripeinfo[which].index + stripeinfo[which].subcount;
                 LASSERT(shift < oa_bufs);
                 ioarr[shift] = pga[i];
-                lov_stripe_offset(lsm, pga[i].off, which,
-                                  &ioarr[shift].off);
+                lov_stripe_offset(lsm, pga[i].disk_offset, which,
+                                  &ioarr[shift].disk_offset);
                 stripeinfo[which].subcount++;
         }
 
@@ -1940,7 +1933,7 @@ static int lov_brw(int cmd, struct obd_export *exp, struct obdo *src_oa,
                                      tmp_oa, &si->lsm, si->bufct,
                                      &ioarr[shift], oti);
                         if (rc)
-                                GOTO(out_ioarr, rc);
+                                GOTO(out_oa, rc);
 
                         lov_merge_attrs(ret_oa, tmp_oa, tmp_oa->o_valid, lsm,
                                         i, &set);
@@ -2051,7 +2044,7 @@ static int lov_brw_async(int cmd, struct obd_export *exp, struct obdo *oa,
                 GOTO(out_obdos, rc = -ENOMEM);
 
         for (i = 0; i < oa_bufs; i++) {
-                where[i] = lov_stripe_number(lsm, pga[i].off);
+                where[i] = lov_stripe_number(lsm, pga[i].disk_offset);
                 stripeinfo[where[i]].bufct++;
         }
 
@@ -2075,8 +2068,8 @@ static int lov_brw_async(int cmd, struct obd_export *exp, struct obdo *oa,
                 shift = stripeinfo[which].index + stripeinfo[which].subcount;
                 LASSERT(shift < oa_bufs);
                 ioarr[shift] = pga[i];
-                lov_stripe_offset(lsm, pga[i].off, which,
-                                  &ioarr[shift].off);
+                lov_stripe_offset(lsm, pga[i].disk_offset, which,
+                                  &ioarr[shift].disk_offset);
                 stripeinfo[which].subcount++;
         }
 
@@ -2953,8 +2946,9 @@ static int lov_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                         if (err) {
                                 if (lov->tgts[i].active) {
                                         CERROR("error: iocontrol OSC %s on OST"
-                                               "idx %d: err = %d\n",
-                                               lov->tgts[i].uuid.uuid, i, err);
+                                               "idx %d: cmd %x err = %d\n",
+                                               lov->tgts[i].uuid.uuid, i,
+                                               cmd, err);
                                         if (!rc)
                                                 rc = err;
                                 }
@@ -3114,12 +3108,12 @@ static int lov_set_info(struct obd_export *exp, obd_count keylen,
 
 }
 
-/* Merge rss if kms == 0
+/* Merge rss if @kms_only == 0
  *
  * Even when merging RSS, we will take the KMS value if it's larger.
  * This prevents getattr from stomping on dirty cached pages which
  * extend the file size. */
-__u64 lov_merge_size(struct lov_stripe_md *lsm, int kms)
+__u64 lov_merge_size(struct lov_stripe_md *lsm, int kms_only)
 {
         struct lov_oinfo *loi;
         __u64 size = 0;
@@ -3130,7 +3124,7 @@ __u64 lov_merge_size(struct lov_stripe_md *lsm, int kms)
                 obd_size lov_size, tmpsize;
 
                 tmpsize = loi->loi_kms;
-                if (kms == 0 && loi->loi_rss > tmpsize)
+                if (kms_only == 0 && loi->loi_rss > tmpsize)
                         tmpsize = loi->loi_rss;
 
                 lov_size = lov_stripe_size(lsm, tmpsize, i);
diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c
index 25945594c2..378422ee83 100644
--- a/lustre/lov/lov_pack.c
+++ b/lustre/lov/lov_pack.c
@@ -581,7 +581,8 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
 
         /* User wasn't expecting this many OST entries */
         if (lum.lmm_stripe_count == 0) {
-                if (copy_to_user(lump, lmmk, sizeof(lum)))
+                rc = copy_to_user(lump, lmmk, sizeof(lum));
+                if (rc)
                         rc = -EFAULT;
         } else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) {
                 rc = -EOVERFLOW;
diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c
index 2c04a3775a..3d631dc626 100644
--- a/lustre/lvfs/fsfilt_ext3.c
+++ b/lustre/lvfs/fsfilt_ext3.c
@@ -446,6 +446,8 @@ static int fsfilt_ext3_set_md(struct inode *inode, void *handle,
 {
         int rc;
 
+        LASSERT(down_trylock(&inode->i_sem) != 0);
+
         /* keep this when we get rid of OLD_EA (too noisy during conversion) */
         if (EXT3_I(inode)->i_file_acl /* || large inode EA flag */)
                 CWARN("setting EA on %lu/%u again... interesting\n",
@@ -491,23 +493,22 @@ static int fsfilt_ext3_get_md(struct inode *inode, void *lmm, int lmm_size)
 }
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-static int fsfilt_ext3_send_bio(struct inode *inode, struct bio *bio)
+static int fsfilt_ext3_send_bio(int rw, struct inode *inode, struct bio *bio)
 {
-        submit_bio(WRITE, bio);
+        submit_bio(rw, bio);
         return 0;
 }
 #else
-static int fsfilt_ext3_send_bio(struct inode *inode, struct kiobuf *bio)
+static int fsfilt_ext3_send_bio(int rw, struct inode *inode, struct kiobuf *bio)
 {
         int rc, blocks_per_page;
 
-        rc = brw_kiovec(WRITE, 1, &bio, inode->i_dev,
+        rc = brw_kiovec(rw, 1, &bio, inode->i_dev,
                         bio->blocks, 1 << inode->i_blkbits);
 
         blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
 
-        if (rc != (1 << inode->i_blkbits) * bio->nr_pages *
-            blocks_per_page) {
+        if (rc != (1 << inode->i_blkbits) * bio->nr_pages * blocks_per_page) {
                 CERROR("short write?  expected %d, wrote %d\n",
                        (1 << inode->i_blkbits) * bio->nr_pages *
                        blocks_per_page, rc);
@@ -665,6 +666,25 @@ static int fsfilt_ext3_sync(struct super_block *sb)
 }
 
 #ifdef EXT3_MULTIBLOCK_ALLOCATOR
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#define ext3_up_truncate_sem(inode)  up_write(&EXT3_I(inode)->truncate_sem);
+#define ext3_down_truncate_sem(inode)  down_write(&EXT3_I(inode)->truncate_sem);
+#else
+#define ext3_up_truncate_sem(inode)  up(&EXT3_I(inode)->truncate_sem);
+#define ext3_down_truncate_sem(inode)  down(&EXT3_I(inode)->truncate_sem);
+#endif
+                                                                                                                                                                                                     
+#include <linux/lustre_version.h>
+#if EXT3_EXT_MAGIC == 0xf301
+#define ee_start e_start
+#define ee_block e_block
+#define ee_len   e_num
+#endif
+#ifndef EXT3_BB_MAX_BLOCKS
+#define ext3_mb_new_blocks(handle, inode, goal, count, aflags, err) \
+        ext3_new_blocks(handle, inode, count, goal, err)
+#endif
+
 struct bpointers {
         unsigned long *blocks;
         int *created;
@@ -673,35 +693,37 @@ struct bpointers {
         int init_num;
         int create;
 };
-
 static int ext3_ext_find_goal(struct inode *inode, struct ext3_ext_path *path,
-        			unsigned long block)
+                                unsigned long block, int *aflags)
 {
-	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->ee_start + (block - ex->ee_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;
+        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)) {
+                        if (ex->ee_block + ex->ee_len == block)
+                                *aflags |= 1;
+                        return ex->ee_start + (block - ex->ee_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_ext_new_extent_cb(struct ext3_extents_tree *tree,
@@ -715,17 +737,17 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
         unsigned long tgen;
         loff_t new_i_size;
         handle_t *handle;
-        int i;
-
+        int i, aflags = 0;
+                                                                                                                                                                                                     
         i = EXT_DEPTH(tree);
         EXT_ASSERT(i == path->p_depth);
         EXT_ASSERT(path[i].p_hdr);
-
+                                                                                                                                                                                                     
         if (exist) {
                 err = EXT_CONTINUE;
                 goto map;
         }
-
+                                                                                                                                                                                                     
         if (bp->create == 0) {
                 i = 0;
                 if (newex->ee_block < bp->start)
@@ -741,46 +763,46 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
                         bp->num--;
                         bp->start++;
                 }
-
+                                                                                                                                                                                                     
                 return EXT_CONTINUE;
         }
-
         tgen = EXT_GENERATION(tree);
         count = ext3_ext_calc_credits_for_insert(tree, path);
-        up_write(&EXT3_I(inode)->truncate_sem);
-
+        ext3_up_truncate_sem(inode);
+                                                                                                                                                                                                     
         lock_kernel();
         handle = journal_start(EXT3_JOURNAL(inode), count + EXT3_ALLOC_NEEDED + 1);
         unlock_kernel();
         if (IS_ERR(handle)) {
-                down_write(&EXT3_I(inode)->truncate_sem);
+                ext3_down_truncate_sem(inode);
                 return PTR_ERR(handle);
         }
-
+                                                                                                                                                                                                     
         if (tgen != EXT_GENERATION(tree)) {
                 /* the tree has changed. so path can be invalid at moment */
                 lock_kernel();
                 journal_stop(handle);
                 unlock_kernel();
-                down_write(&EXT3_I(inode)->truncate_sem);
+                ext3_down_truncate_sem(inode);
                 return EXT_REPEAT;
         }
-
-        down_write(&EXT3_I(inode)->truncate_sem);
-        goal = ext3_ext_find_goal(inode, path, newex->ee_block);
+                                                                                                                                                                                                     
+        ext3_down_truncate_sem(inode);
         count = newex->ee_len;
-        pblock = ext3_new_blocks(handle, inode, &count, goal, &err);
+        goal = ext3_ext_find_goal(inode, path, newex->ee_block, &aflags);
+        aflags |= 2; /* block have been already reserved */
+        pblock = ext3_mb_new_blocks(handle, inode, goal, &count, aflags, &err);
         if (!pblock)
                 goto out;
         EXT_ASSERT(count <= newex->ee_len);
-
+                                                                                                                                                                                                     
         /* insert new extent */
         newex->ee_start = pblock;
         newex->ee_len = count;
         err = ext3_ext_insert_extent(handle, tree, path, newex);
         if (err)
                 goto out;
-
+                                                                                                                                                                                                     
         /* correct on-disk inode size */
         if (newex->ee_len > 0) {
                 new_i_size = (loff_t) newex->ee_block + newex->ee_len;
@@ -790,7 +812,6 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
                         err = ext3_mark_inode_dirty(handle, inode);
                 }
         }
-
 out:
         lock_kernel();
         journal_stop(handle);
@@ -818,11 +839,12 @@ map:
                         *(bp->blocks) = newex->ee_start + i;
                         bp->blocks++;
                         bp->num--;
+                        bp->start++;
                 }
         }
         return err;
 }
-
+                                                                                                                                                                                                     
 int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
                        unsigned long num, unsigned long *blocks,
                        int *created, int create)
@@ -830,10 +852,10 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
         struct ext3_extents_tree tree;
         struct bpointers bp;
         int err;
-
+                                                                                                                                                                                                     
         CDEBUG(D_OTHER, "blocks %lu-%lu requested for inode %u\n",
                 block, block + num, (unsigned) inode->i_ino);
-
+                                                                                                                                                                                                     
         ext3_init_tree_desc(&tree, inode);
         tree.private = &bp;
         bp.blocks = blocks;
@@ -841,12 +863,12 @@ int fsfilt_map_nblocks(struct inode *inode, unsigned long block,
         bp.start = block;
         bp.init_num = bp.num = num;
         bp.create = create;
-
-        down_write(&EXT3_I(inode)->truncate_sem);
+                                                                                                                                                                                                     
+        ext3_down_truncate_sem(inode);
         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);
-
+        ext3_up_truncate_sem(inode);
+                                                                                                                                                                                                     
         return err;
 }
 
@@ -1397,15 +1419,10 @@ out:
 
 static void __exit fsfilt_ext3_exit(void)
 {
-        int rc;
-
         fsfilt_unregister_ops(&fsfilt_ext3_ops);
-        rc = kmem_cache_destroy(fcb_cache);
-
-        if (rc || atomic_read(&fcb_cache_count)) {
-                CERROR("can't free fsfilt callback cache: count %d, rc = %d\n",
-                       atomic_read(&fcb_cache_count), rc);
-        }
+        LASSERTF(kmem_cache_destroy(fcb_cache) == 0,
+                 "can't free fsfilt callback cache: count %d\n",
+                 atomic_read(&fcb_cache_count));
 }
 
 module_init(fsfilt_ext3_init);
diff --git a/lustre/lvfs/fsfilt_smfs.c b/lustre/lvfs/fsfilt_smfs.c
index d1573f6a51..b64cf9126c 100644
--- a/lustre/lvfs/fsfilt_smfs.c
+++ b/lustre/lvfs/fsfilt_smfs.c
@@ -231,11 +231,11 @@ static int fsfilt_smfs_iocontrol(struct inode *inode, struct file *file,
         } else {
                 rc = cache_fsfilt->fs_iocontrol(cache_inode, NULL, cmd, arg);
         }
-
+#if 0
         /* FIXME-UMKA: Should this be in duplicate_inode()? */
         if (rc == 0 && cmd == EXT3_IOC_SETFLAGS)
                 inode->i_flags = cache_inode->i_flags;
-
+#endif
         post_smfs_inode(inode, cache_inode);
 
         RETURN(rc);
@@ -301,11 +301,7 @@ static int fsfilt_smfs_get_md(struct inode *inode, void *lmm, int lmm_size)
         RETURN(rc);
 }
 
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-static int fsfilt_smfs_send_bio(struct inode *inode, struct bio *bio)
-#else
-static int fsfilt_smfs_send_bio(struct inode *inode, struct kiobuf *bio)
-#endif
+static int fsfilt_smfs_send_bio(int rw, struct inode *inode, struct kiobuf *bio)
 {
         struct inode *cache_inode;
         struct fsfilt_operations *cache_fsfilt;
@@ -321,7 +317,7 @@ static int fsfilt_smfs_send_bio(struct inode *inode, struct kiobuf *bio)
         if (!cache_fsfilt->fs_send_bio)
                 RETURN(-ENOSYS);
 
-        return cache_fsfilt->fs_send_bio(cache_inode, bio);
+        return cache_fsfilt->fs_send_bio(rw, cache_inode, bio);
 }
 
 static struct page *
diff --git a/lustre/lvfs/llog.c b/lustre/lvfs/llog.c
index ae06d647ee..99bb653aa3 100644
--- a/lustre/lvfs/llog.c
+++ b/lustre/lvfs/llog.c
@@ -100,17 +100,23 @@ int llog_cancel_rec(struct llog_handle *loghandle, int index)
             (le32_to_cpu(llh->llh_count) == 1) &&
             (loghandle->lgh_last_idx == (LLOG_BITMAP_BYTES * 8) - 1)) {
                 rc = llog_destroy(loghandle);
-                if (rc)
+                if (rc) {
                         CERROR("failure destroying log after last cancel: %d\n",
                                rc);
-                LASSERT(rc == 0);
-                RETURN(1);
+                        ext2_set_bit(index, llh->llh_bitmap);
+                        llh->llh_count++;
+                } else {
+                        rc = 1;
+                }
+                RETURN(rc);
         }
 
         rc = llog_write_rec(loghandle, &llh->llh_hdr, NULL, 0, NULL, 0);
-        if (rc)
+        if (rc) {
                 CERROR("failure re-writing header %d\n", rc);
-        LASSERT(rc == 0);
+                ext2_set_bit(index, llh->llh_bitmap);
+                llh->llh_count++;
+        }
         RETURN(rc);
 }
 EXPORT_SYMBOL(llog_cancel_rec);
@@ -182,7 +188,7 @@ int llog_close(struct llog_handle *loghandle)
         if (rc)
                 GOTO(out, rc);
         if (lop->lop_close == NULL)
-                GOTO(out, -EOPNOTSUPP);
+                GOTO(out, rc = -EOPNOTSUPP);
         rc = lop->lop_close(loghandle);
  out:
         llog_free_handle(loghandle);
diff --git a/lustre/lvfs/llog_lvfs.c b/lustre/lvfs/llog_lvfs.c
index 938cfc3523..1aa8be9d1d 100644
--- a/lustre/lvfs/llog_lvfs.c
+++ b/lustre/lvfs/llog_lvfs.c
@@ -253,6 +253,7 @@ static int llog_lvfs_write_rec(struct llog_handle *loghandle,
 
         loghandle->lgh_last_idx++;
         index = loghandle->lgh_last_idx;
+        LASSERT(index < LLOG_BITMAP_SIZE(llh));
         rec->lrh_index = cpu_to_le32(index);
         if (buf == NULL) {
                 lrt = (void *)rec + le32_to_cpu(rec->lrh_len) - sizeof(*lrt);
@@ -773,9 +774,14 @@ static int llog_add_link_object(struct llog_ctxt *ctxt, struct llog_logid logid,
         lock_kernel();
         rc = vfs_link(dentry, ctxt->loc_objects_dir->d_inode, new_child);
         unlock_kernel();
-        if (rc)
-                CERROR("error link new object "LPX64":%u: rc %d\n",
+        if (rc) {
+                CERROR("error link new object "LPX64":%08x: rc %d\n",
                        logid.lgl_oid, logid.lgl_ogen, rc);
+                /* it doesn't make much sense to get -EEXIST here */
+                LASSERTF(rc != -EEXIST, "bug 3490: dentry: %p "
+                         "dir->d_ionode %p new_child: %p  \n",
+                         dentry, ctxt->loc_objects_dir->d_inode, new_child);
+        }
         err = llog_fsfilt_commit(ctxt, ctxt->loc_objects_dir->d_inode, handle, 0);
 out_dput:
         l_dput(new_child);
@@ -963,7 +969,7 @@ out:
 
 /* reads the catalog list */
 int llog_get_cat_list(struct lvfs_run_ctxt *ctxt,
-                      struct fsfilt_operations *fsops, char *name,
+                      struct fsfilt_operations *fsops, const char *name,
                       int count, struct llog_catid *idarray)
 {
         struct lvfs_run_ctxt saved;
@@ -1008,7 +1014,7 @@ EXPORT_SYMBOL(llog_get_cat_list);
 
 /* writes the cat list */
 int llog_put_cat_list(struct lvfs_run_ctxt *ctxt,
-                      struct fsfilt_operations *fsops, char *name,
+                      struct fsfilt_operations *fsops, const char *name,
                       int count, struct llog_catid *idarray)
 {
         struct lvfs_run_ctxt saved;
@@ -1099,7 +1105,7 @@ static int llog_lvfs_destroy(struct llog_handle *handle)
 }
 
 int llog_get_cat_list(struct lvfs_run_ctxt *ctxt,
-                      struct fsfilt_operations *fsops, char *name,
+                      struct fsfilt_operations *fsops, const char *name,
                       int count, struct llog_catid *idarray)
 {
         LBUG();
@@ -1107,7 +1113,7 @@ int llog_get_cat_list(struct lvfs_run_ctxt *ctxt,
 }
 
 int llog_put_cat_list(struct lvfs_run_ctxt *ctxt,
-                      struct fsfilt_operations *fsops, char *name,
+                      struct fsfilt_operations *fsops, const char *name,
                       int count, struct llog_catid *idarray)
 {
         LBUG();
diff --git a/lustre/lvfs/lvfs_internal.h b/lustre/lvfs/lvfs_internal.h
index 84e9aaa506..def6c9aa77 100644
--- a/lustre/lvfs/lvfs_internal.h
+++ b/lustre/lvfs/lvfs_internal.h
@@ -4,6 +4,10 @@ void fsfilt_ext3_exit(void);
 int  fsfilt_extN_init(void);
 void fsfilt_extN_exit(void);
 
+int  fsfilt_ldiskfs_init(void);
+void fsfilt_ldiskfs_exit(void);
+
+
 int  fsfilt_reiser_init(void);
 void fsfilt_reiser_exit(void);
 
diff --git a/lustre/lvfs/lvfs_linux.c b/lustre/lvfs/lvfs_linux.c
index bbe3a5dfa1..e8b7d49c30 100644
--- a/lustre/lvfs/lvfs_linux.c
+++ b/lustre/lvfs/lvfs_linux.c
@@ -1,7 +1,7 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- *  lustre/lib/fsfilt_ext3.c
+ *  lustre/lib/lvfs_linux.c
  *  Lustre filesystem abstraction routines
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
@@ -32,7 +32,6 @@
 #include <linux/version.h>
 #include <linux/fs.h>
 #include <asm/unistd.h>
-#include <linux/jbd.h>
 #include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/quotaops.h>
@@ -58,8 +57,10 @@ int obd_memmax;
 /* Debugging check only needed during development */
 #ifdef OBD_CTXT_DEBUG
 # define ASSERT_CTXT_MAGIC(magic) LASSERT((magic) == OBD_RUN_CTXT_MAGIC)
-# define ASSERT_NOT_KERNEL_CTXT(msg) LASSERT(!segment_eq(get_fs(), get_ds()))
-# define ASSERT_KERNEL_CTXT(msg) LASSERT(segment_eq(get_fs(), get_ds()))
+# define ASSERT_NOT_KERNEL_CTXT(msg) LASSERTF(!segment_eq(get_fs(), get_ds()),\
+                                              msg)
+# define ASSERT_KERNEL_CTXT(msg) LASSERTF(segment_eq(get_fs(), get_ds()), msg)
+
 #else
 # define ASSERT_CTXT_MAGIC(magic) do {} while(0)
 # define ASSERT_NOT_KERNEL_CTXT(msg) do {} while(0)
@@ -76,7 +77,7 @@ static void push_group_info(struct lvfs_run_ctxt *save,
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
                 task_lock(current);
                 save->group_info = current->group_info;
-                current->group_info = group_info;
+                current->group_info = ginfo;
                 task_unlock(current);
 #else
                 LASSERT(ginfo->ngroups <= NGROUPS);
@@ -140,6 +141,7 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
         save->pwd = dget(current->fs->pwd);
         save->pwdmnt = mntget(current->fs->pwdmnt);
         save->ngroups = current_ngroups;
+        save->luc.luc_umask = current->fs->umask;
 
         LASSERT(save->pwd);
         LASSERT(save->pwdmnt);
@@ -157,6 +159,7 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
 
                 push_group_info(save, uc->luc_ginfo);
         }
+        current->fs->umask = 0; /* umask already applied on client */
         set_fs(new_ctx->fs);
         set_fs_pwd(current->fs, new_ctx->pwdmnt, new_ctx->pwd);
 
@@ -203,6 +206,7 @@ void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx,
 
         dput(saved->pwd);
         mntput(saved->pwdmnt);
+        current->fs->umask = saved->luc.luc_umask;
         if (uc) {
                 current->fsuid = saved->luc.luc_fsuid;
                 current->fsgid = saved->luc.luc_fsgid;
diff --git a/lustre/lvfs/lvfs_reint.c b/lustre/lvfs/lvfs_reint.c
index 6e4125ce8f..3f8ddc2918 100644
--- a/lustre/lvfs/lvfs_reint.c
+++ b/lustre/lvfs/lvfs_reint.c
@@ -139,7 +139,7 @@ static int lvfs_reint_create(struct super_block *sb, struct reint_record *r_rec)
                 handle = fsfilt->fs_start(dir, FSFILT_OP_SYMLINK, NULL, 0);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
-                rc = vfs_symlink(dir, dentry, new_path);
+                rc = ll_vfs_symlink(dir, dentry, new_path);
                 break;
         }
         case S_IFCHR:
diff --git a/lustre/lvfs/lvfs_userfs.c b/lustre/lvfs/lvfs_userfs.c
index 396ee300e7..bca6e6aa61 100644
--- a/lustre/lvfs/lvfs_userfs.c
+++ b/lustre/lvfs/lvfs_userfs.c
@@ -1,7 +1,7 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- *  lustre/lib/fsfilt_ext3.c
+ *  lustre/lib/lvfs_userfs.c
  *  Lustre filesystem abstraction routines
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c
index cc7053cde7..799856562e 100644
--- a/lustre/mdc/mdc_locks.c
+++ b/lustre/mdc/mdc_locks.c
@@ -451,8 +451,8 @@ int mdc_intent_lock(struct obd_export *exp,
         ENTRY;
         LASSERT(it);
 
-        CDEBUG(D_DLMTRACE, "name: %*s in %ld, intent: %s\n", len, name,
-               pfid ? (unsigned long) pfid->id : 0 , ldlm_it2str(it->it_op));
+        CDEBUG(D_DLMTRACE, "name: %*s in inode "LPU64", intent: %s flags %#o\n",
+               len, name, pfid->id, ldlm_it2str(it->it_op), it->it_flags);
 
         if (cfid && (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR ||
                      it->it_op == IT_CHDIR)) {
@@ -488,7 +488,11 @@ int mdc_intent_lock(struct obd_export *exp,
                                sizeof(lockh));
                         it->d.lustre.it_lock_mode = mode;
                 }
-                RETURN(rc);
+
+                /* Only return failure if it was not GETATTR by cfid
+                   (from inode_revalidate) */
+                if (rc || name)
+                        RETURN(rc);
         }
 
         /* lookup_it may be called only after revalidate_it has run, because
@@ -512,7 +516,24 @@ int mdc_intent_lock(struct obd_export *exp,
         }
         request = *reqp = it->d.lustre.it_data;
         LASSERT(request != NULL);
+        
+        /* If we're doing an IT_OPEN which did not result in an actual
+         * successful open, then we need to remove the bit which saves
+         * this request for unconditional replay.
+         *
+         * It's important that we do this first!  Otherwise we might exit the
+         * function without doing so, and try to replay a failed create
+         * (bug 3440) */
+        if (it->it_op & IT_OPEN) {
+                if (!it_disposition(it, DISP_OPEN_OPEN) ||
+                    it->d.lustre.it_status != 0) {
+                        unsigned long irqflags;
 
+                        spin_lock_irqsave(&request->rq_lock, irqflags);
+                        request->rq_replay = 0;
+                        spin_unlock_irqrestore(&request->rq_lock, irqflags);
+                }
+        }
         if (!it_disposition(it, DISP_IT_EXECD)) {
                 /* The server failed before it even started executing the
                  * intent, i.e. because it couldn't unpack the request. */
@@ -541,20 +562,6 @@ int mdc_intent_lock(struct obd_export *exp,
                         RETURN(-ESTALE);
         }
 
-        /* If we're doing an IT_OPEN which did not result in an actual
-         * successful open, then we need to remove the bit which saves
-         * this request for unconditional replay. */
-        if (it->it_op & IT_OPEN) {
-                if (!it_disposition(it, DISP_OPEN_OPEN) ||
-                    it->d.lustre.it_status != 0) {
-                        unsigned long irqflags;
-
-                        spin_lock_irqsave(&request->rq_lock, irqflags);
-                        request->rq_replay = 0;
-                        spin_unlock_irqrestore(&request->rq_lock, irqflags);
-                }
-        }
-
         rc = it_open_error(DISP_LOOKUP_EXECD, it);
         if (rc)
                 RETURN(rc);
@@ -564,13 +571,13 @@ int mdc_intent_lock(struct obd_export *exp,
          */
         if (it_disposition(it, DISP_OPEN_CREATE) &&
             !it_open_error(DISP_OPEN_CREATE, it))
-                ptlrpc_request_addref(request);
+                ptlrpc_request_addref(request); /* balanced in ll_create_node */
         if (it_disposition(it, DISP_OPEN_OPEN) &&
             !it_open_error(DISP_OPEN_OPEN, it))
-                ptlrpc_request_addref(request);
+                ptlrpc_request_addref(request); /* balanced in ll_file_open */
 
         if (it->it_op & IT_CREAT) {
-                /* XXX this belongs in ll_create_iit */
+                /* XXX this belongs in ll_create_it */
         } else if (it->it_op == IT_OPEN) {
                 LASSERT(!it_disposition(it, DISP_OPEN_CREATE));
         } else {
diff --git a/lustre/mdc/mdc_reint.c b/lustre/mdc/mdc_reint.c
index 0515372222..b34e1e1893 100644
--- a/lustre/mdc/mdc_reint.c
+++ b/lustre/mdc/mdc_reint.c
@@ -168,11 +168,11 @@ int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
 int mdc_unlink(struct obd_export *exp, struct mdc_op_data *data,
                struct ptlrpc_request **request)
 {
-        struct obd_device *obddev = class_exp2obd(exp);
+        struct obd_device *obd = class_exp2obd(exp);
         struct ptlrpc_request *req = *request;
         int rc, size[4] = {0, sizeof(struct mds_rec_unlink),
                            data->namelen + 1,
-                           obddev->u.cli.cl_max_mds_cookiesize};
+                           obd->u.cli.cl_max_mds_cookiesize};
         ENTRY;
         LASSERT(req == NULL);
 
@@ -187,13 +187,14 @@ int mdc_unlink(struct obd_export *exp, struct mdc_op_data *data,
         *request = req;
 
         size[0] = sizeof(struct mds_body);
-        size[1] = obddev->u.cli.cl_max_mds_easize;
-        size[2] = obddev->u.cli.cl_max_mds_cookiesize;
+        size[1] = obd->u.cli.cl_max_mds_easize;
+        size[2] = obd->u.cli.cl_max_mds_cookiesize;
+
         req->rq_replen = lustre_msg_size(3, size);
 
         mdc_unlink_pack(req->rq_reqmsg, 1, data);
 
-        rc = mdc_reint(req, obddev->u.cli.cl_rpc_lock, LUSTRE_IMP_FULL);
+        rc = mdc_reint(req, obd->u.cli.cl_rpc_lock, LUSTRE_IMP_FULL);
         if (rc == -ERESTARTSYS)
                 rc = 0;
         RETURN(rc);
diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c
index 02888bba22..4d0151a28b 100644
--- a/lustre/mdc/mdc_request.c
+++ b/lustre/mdc/mdc_request.c
@@ -77,7 +77,7 @@ void mdc_pack_secdesc(struct ptlrpc_request *req, int size)
         get_group_info(current->group_info);
         ginfo = current->group_info;
         task_unlock(current);
-        if (rsd->rsd_ngroups > ginfo->ngropus)
+        if (rsd->rsd_ngroups > ginfo->ngroups)
                 rsd->rsd_ngroups = ginfo->ngroups;
         memcpy(rsd->rsd_groups, ginfo->blocks[0],
                rsd->rsd_ngroups * sizeof(__u32));
@@ -242,7 +242,7 @@ int mdc_getattr_name(struct obd_export *exp, struct ll_fid *fid,
         size[0] = mdc_get_secdesc_size();
 
         req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MDS_VERSION,
-                              MDS_GETATTR_NAME, 3, size, NULL);
+                              MDS_GETATTR_LOCK, 3, size, NULL);
         if (!req)
                 GOTO(out, rc = -ENOMEM);
 
@@ -621,7 +621,6 @@ int mdc_close(struct obd_export *exp, struct obdo *oa,
         if (req->rq_async_args.pointer_arg[0] != NULL) {
                 CERROR("returned without dropping rpc_lock: rc %d\n", rc);
                 mdc_close_interpret(req, &req->rq_async_args, rc);
-                portals_debug_dumplog();
         }
 
         EXIT;
@@ -1260,12 +1259,12 @@ int mdc_brw(int rw, struct obd_export *exp, struct obdo *oa,
                 struct brw_page *pg = &pgarr[i];
 
                 LASSERT(pg->count > 0);
-                LASSERT((pg->off & ~PAGE_MASK) + pg->count <= PAGE_SIZE);
+                LASSERT((pg->disk_offset & ~PAGE_MASK) + pg->count <= PAGE_SIZE);
 
-                ptlrpc_prep_bulk_page(desc, pg->pg, pg->off & ~PAGE_MASK,
+                ptlrpc_prep_bulk_page(desc, pg->pg, pg->disk_offset & ~PAGE_MASK,
                                       pg->count);
 
-                niobuf->offset = pg->off;
+                niobuf->offset = pg->disk_offset;
                 niobuf->len = pg->count;
                 niobuf->flags = pg->flag;
         }
@@ -1332,6 +1331,8 @@ struct obd_ops mdc_obd_ops = {
         .o_setup         = mdc_setup,
         .o_precleanup    = mdc_precleanup,
         .o_cleanup       = mdc_cleanup,
+        .o_add_conn      = client_import_add_conn,
+        .o_del_conn      = client_import_del_conn,
         .o_connect       = client_connect_import,
         .o_disconnect    = client_disconnect_export,
         .o_iocontrol     = mdc_iocontrol,
diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c
index ffaac22b62..d827236e8d 100644
--- a/lustre/mds/handler.c
+++ b/lustre/mds/handler.c
@@ -55,10 +55,6 @@
 #include <linux/lprocfs_status.h>
 #include <linux/lustre_commit_confd.h>
 
-#ifdef CONFIG_SNAPFS
-#include <linux/lustre_smfs.h>
-#include <linux/lustre_snap.h>
-#endif
 #include "mds_internal.h"
 
 static int mds_intent_policy(struct ldlm_namespace *ns,
@@ -122,7 +118,7 @@ static int mds_sendpage(struct ptlrpc_request *req, struct file *file,
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_SENDPAGE)) {
                 CERROR("obd_fail_loc=%x, fail operation rc=%d\n",
-                       OBD_FAIL_MDS_SENDPAGE, rc);
+                       OBD_FAIL_MDS_SENDPAGE, rc = -EIO);
                 GOTO(abort_bulk, rc);
         }
 
@@ -323,6 +319,13 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
         if (!inode)
                 RETURN(ERR_PTR(-ENOENT));
 
+        if (is_bad_inode(inode)) {
+                CERROR("bad inode returned %lu/%u\n",
+                       inode->i_ino, inode->i_generation);
+                dput(result);
+                RETURN(ERR_PTR(-ENOENT));
+        }
+
         /* here we disabled generation check, as root inode i_generation
          * of cache mds and real mds are different. */
         if (inode->i_ino != mds->mds_rootfid.id && generation &&
@@ -461,9 +464,11 @@ static int mds_destroy_export(struct obd_export *export)
                        dentry->d_name.len, dentry->d_name.name,
                        ll_bdevname(dentry->d_inode->i_sb, btmp),
                        dentry->d_inode->i_ino);
+                /* child inode->i_alloc_sem protects orphan_dec_test and
+                 * is_orphan race, mds_mfd_close drops it */
+                DOWN_WRITE_I_ALLOC_SEM(dentry->d_inode);
                 rc = mds_mfd_close(NULL, 0, obd, mfd,
                                    !(export->exp_flags & OBD_OPT_FAILOVER));
-
                 if (rc)
                         CDEBUG(D_INODE, "Error closing file: %d\n", rc);
                 spin_lock(&med->med_open_lock);
@@ -787,7 +792,7 @@ static int mds_getattr_pack_msg_cf(struct ptlrpc_request *req,
 
         rc = lustre_pack_reply(req, 1, size, NULL);
         if (rc) {
-                CERROR("out of memory\n");
+                CERROR("lustre_pack_reply failed: rc %d\n", rc);
                 GOTO(out, req->rq_status = rc);
         }
 
@@ -884,7 +889,7 @@ int mds_check_mds_num(struct obd_device *obd, struct inode* inode,
         RETURN(rc);
 }
 
-static int mds_getattr_name(struct ptlrpc_request *req, int offset,
+static int mds_getattr_lock(struct ptlrpc_request *req, int offset,
                             struct lustre_handle *child_lockh, int child_part)
 {
         struct obd_device *obd = req->rq_export->exp_obd;
@@ -895,11 +900,10 @@ static int mds_getattr_name(struct ptlrpc_request *req, int offset,
         struct mds_body *body;
         struct dentry *dparent = NULL, *dchild = NULL;
         struct lvfs_ucred uc;
-        struct lustre_handle parent_lockh[2];
-        int namesize, update_mode;
-        int rc = 0, cleanup_phase = 0, resent_req = 0, reply_offset;
-        struct clonefs_info *clone_info = NULL;
-        char *name;
+        struct lustre_handle parent_lockh[2] = {{0}, {0}};
+        unsigned int namesize;
+        int rc = 0, cleanup_phase = 0, resent_req = 0, update_mode, reply_offset;
+        char *name = NULL;
         ENTRY;
 
         LASSERT(!strcmp(obd->obd_type->typ_name, LUSTRE_MDS_NAME));
@@ -929,8 +933,13 @@ static int mds_getattr_name(struct ptlrpc_request *req, int offset,
         }
         namesize = req->rq_reqmsg->buflens[offset + 1];
 
+        /* namesize less than 2 means we have empty name, probably came from
+           revalidate by cfid, so no point in having name to be set */
+        if (namesize <= 1)
+                name = NULL;
+
         LASSERT (offset == 1 || offset == 3);
-        /* if requests were at offset 3, the getattr reply goes back at 1 */
+        /* if requests were at offset 2, the getattr reply goes back at 1 */
         if (offset == 3) {
                 rep = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*rep));
                 reply_offset = 1;
@@ -949,28 +958,11 @@ static int mds_getattr_name(struct ptlrpc_request *req, int offset,
         intent_set_disposition(rep, DISP_LOOKUP_EXECD);
 
         LASSERT(namesize > 0);
-        if (namesize == 1) {
-                /* we have no dentry here, drop LOOKUP bit */
-                child_part &= ~MDS_INODELOCK_LOOKUP;
-                CDEBUG(D_OTHER, "%s: request to retrieve attrs for %lu/%lu\n",
-                       obd->obd_name, (unsigned long) body->fid1.id,
-                       (unsigned long) body->fid1.generation);
-                dchild = mds_fid2locked_dentry(obd, &body->fid1, NULL, LCK_PR,
-                                               parent_lockh, &update_mode, 
-                                               NULL, 0, child_part);
-                if (IS_ERR(dchild)) {
-                        CERROR("can't find inode: %d\n", (int) PTR_ERR(dchild));
-                        GOTO(cleanup, rc = PTR_ERR(dchild));
-                }
-                memcpy(child_lockh, parent_lockh, sizeof(parent_lockh[0]));
-#ifdef S_PDIROPS
-                if (parent_lockh[1].cookie)
-                        ldlm_lock_decref(parent_lockh + 1, update_mode);
-#endif
-                cleanup_phase = 2;
-                goto fill_inode;
+        if (child_lockh->cookie != 0) {
+                LASSERT(lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT);
+                resent_req = 1;
         }
-        
+#if 0        
 #if HAVE_LOOKUP_RAW
         /* FIXME: handle raw lookup */
         if (body->valid == OBD_MD_FLID) {
@@ -1001,19 +993,51 @@ static int mds_getattr_name(struct ptlrpc_request *req, int offset,
                 GOTO(cleanup, rc);
         }
 #endif
-
-        if (child_lockh->cookie != 0) {
-                LASSERT(lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT);
-                resent_req = 1;
-        }
-
+#endif
         if (resent_req == 0) {
-                rc = mds_get_parent_child_locked(obd, mds, &body->fid1,
-                                                 parent_lockh, &dparent,
-                                                 LCK_PR, MDS_INODELOCK_LOOKUP,
-                                                 &update_mode, name, namesize,
-                                                 child_lockh, &dchild, LCK_PR,
-                                                 child_part, clone_info);
+                if (name) {
+                        rc = mds_get_parent_child_locked(obd, mds, &body->fid1,
+                                                         parent_lockh, &dparent,
+                                                         LCK_PR, 
+                                                         MDS_INODELOCK_LOOKUP,
+                                                         &update_mode, 
+                                                         name, namesize,
+                                                         child_lockh, &dchild, 
+                                                         LCK_PR, child_part);
+                } else {
+                        /* we have no dentry here, drop LOOKUP bit */
+                        /*FIXME: we need MDS_INODELOCK_LOOKUP or not*/
+                        child_part &= ~MDS_INODELOCK_LOOKUP;
+                        CDEBUG(D_OTHER, "%s: retrieve attrs for %lu/%lu\n",
+                               obd->obd_name, (unsigned long) body->fid1.id,
+                               (unsigned long) body->fid1.generation);
+
+#if 0
+                        dchild = mds_fid2locked_dentry(obd, &body->fid1, NULL, 
+                                                       LCK_PR, parent_lockh, 
+                                                       &update_mode,
+                                                       NULL, 0, child_part);
+#else
+                        dchild = mds_fid2locked_dentry(obd, &body->fid1, NULL,
+                                                       LCK_PR, parent_lockh,
+                                                       &update_mode,
+                                                       NULL, 0, 
+                                                       MDS_INODELOCK_UPDATE);
+#endif 
+                        if (IS_ERR(dchild)) {
+                                CERROR("can't find inode: %d\n", 
+                                       (int) PTR_ERR(dchild));
+                                GOTO(cleanup, rc = PTR_ERR(dchild));
+                        }
+                        memcpy(child_lockh, parent_lockh, 
+                               sizeof(parent_lockh[0]));
+#ifdef S_PDIROPS
+                        if (parent_lockh[1].cookie)
+                                ldlm_lock_decref(parent_lockh + 1, update_mode);
+#endif
+                        cleanup_phase = 2;
+                        goto fill_inode;
+                }
                 if (rc)
                         GOTO(cleanup, rc);
                 
@@ -1027,7 +1051,10 @@ static int mds_getattr_name(struct ptlrpc_request *req, int offset,
                 struct ldlm_resource *res;
                 DEBUG_REQ(D_DLMTRACE, req, "resent, not enqueuing new locks");
                 granted_lock = ldlm_handle2lock(child_lockh);
-                LASSERT(granted_lock);
+
+                LASSERTF(granted_lock != NULL, LPU64"/%u lockh "LPX64"\n",
+                         body->fid1.id, body->fid1.generation,
+                         child_lockh->cookie);
 
                 res = granted_lock->l_resource;
                 child_fid.id = res->lr_name.name[0];
@@ -1071,14 +1098,13 @@ fill_inode:
                 if (resent_req == 0) {
                         if (rc && DENTRY_VALID(dchild))
                                 ldlm_lock_decref(child_lockh, LCK_PR);
-                        if (dparent) {
+                        if (name) {
                                 ldlm_lock_decref(parent_lockh, LCK_PR);
+                        }
 #ifdef S_PDIROPS
-                                if (parent_lockh[1].cookie != 0)
-                                        ldlm_lock_decref(parent_lockh + 1,
-                                                         update_mode);
+                        if (parent_lockh[1].cookie != 0)
+                                ldlm_lock_decref(parent_lockh + 1, update_mode);
 #endif
-                        }
                         if (dparent)
                                 l_dput(dparent);
                 }
@@ -1127,14 +1153,14 @@ static int mds_getattr(struct ptlrpc_request *req, int offset)
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
         de = mds_fid2dentry(mds, &body->fid1, NULL);
         if (IS_ERR(de)) {
-                rc = req->rq_status = -ENOENT;
-                GOTO(out_pop, PTR_ERR(de));
+                rc = req->rq_status = PTR_ERR(de);
+                GOTO(out_pop, rc);
         }
 
         rc = mds_getattr_pack_msg(req, de->d_inode, offset);
         if (rc != 0) {
-                CERROR ("mds_getattr_pack_msg: %d\n", rc);
-                GOTO (out_pop, rc);
+                CERROR("mds_getattr_pack_msg: %d\n", rc);
+                GOTO(out_pop, rc);
         }
 
         req->rq_status = mds_getattr_internal(obd, de, req, body, 0);
@@ -1761,7 +1787,7 @@ static int mds_msg_check_version(struct lustre_msg *msg)
         case MDS_STATFS:
         case MDS_GETSTATUS:
         case MDS_GETATTR:
-        case MDS_GETATTR_NAME:
+        case MDS_GETATTR_LOCK:
         case MDS_READPAGE:
         case MDS_REINT:
         case MDS_CLOSE:
@@ -1812,6 +1838,7 @@ static int mds_msg_check_version(struct lustre_msg *msg)
         return rc;
 }
 
+static char str[PTL_NALFMT_SIZE];
 int mds_handle(struct ptlrpc_request *req)
 {
         int should_process, fail = OBD_FAIL_MDS_ALL_REPLY_NET;
@@ -1835,8 +1862,9 @@ int mds_handle(struct ptlrpc_request *req)
                 int recovering;
 
                 if (req->rq_export == NULL) {
-                        CERROR("lustre_mds: operation %d on unconnected MDS\n",
-                               req->rq_reqmsg->opc);
+                        CERROR("operation %d on unconnected MDS from NID %s\n",
+                               req->rq_reqmsg->opc,
+                               ptlrpc_peernid2str(&req->rq_peer, str));
                         req->rq_status = -ENOTCONN;
                         GOTO(out, rc = -ENOTCONN);
                 }
@@ -1847,12 +1875,13 @@ int mds_handle(struct ptlrpc_request *req)
 
                 /* sanity check: if the xid matches, the request must
                  * be marked as a resent or replayed */
-                if (req->rq_xid == med->med_mcd->mcd_last_xid)
+                if (req->rq_xid == med->med_mcd->mcd_last_xid) {
                         LASSERTF(lustre_msg_get_flags(req->rq_reqmsg) &
                                  (MSG_RESENT | MSG_REPLAY),
                                  "rq_xid "LPU64" matches last_xid, "
                                  "expected RESENT flag\n",
                                  req->rq_xid);
+                }
                 /* else: note the opposite is not always true; a
                  * RESENT req after a failover will usually not match
                  * the last_xid, since it was likely never
@@ -1905,17 +1934,17 @@ int mds_handle(struct ptlrpc_request *req)
                 rc = mds_getattr(req, MDS_REQ_REC_OFF);
                 break;
 
-        case MDS_GETATTR_NAME: {
+        case MDS_GETATTR_LOCK: {
                 struct lustre_handle lockh;
                 DEBUG_REQ(D_INODE, req, "getattr_name");
-                OBD_FAIL_RETURN(OBD_FAIL_MDS_GETATTR_NAME_NET, 0);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_GETATTR_LOCK_NET, 0);
 
                 /* If this request gets a reconstructed reply, we won't be
-                 * acquiring any new locks in mds_getattr_name, so we don't
+                 * acquiring any new locks in mds_getattr_lock, so we don't
                  * want to cancel.
                  */
                 lockh.cookie = 0;
-                rc = mds_getattr_name(req, MDS_REQ_REC_OFF, &lockh,
+                rc = mds_getattr_lock(req, MDS_REQ_REC_OFF, &lockh,
                                       MDS_INODELOCK_UPDATE);
                 /* this non-intent call (from an ioctl) is special */
                 req->rq_status = rc;
@@ -2025,6 +2054,7 @@ int mds_handle(struct ptlrpc_request *req)
                 OBD_FAIL_RETURN(OBD_FAIL_LDLM_ENQUEUE, 0);
                 rc = ldlm_handle_enqueue(req, ldlm_server_completion_ast,
                                          ldlm_server_blocking_ast, NULL);
+                fail = OBD_FAIL_LDLM_REPLY;
                 break;
         case LDLM_CONVERT:
                 DEBUG_REQ(D_INODE, req, "convert");
@@ -2170,6 +2200,7 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
         struct mds_obd *mds = &obd->u.mds;
         char *options = NULL;
         struct vfsmount *mnt;
+        char ns_name[48];
         unsigned long page;
         int rc = 0;
         ENTRY;
@@ -2260,8 +2291,9 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
         mds->mds_max_cookiesize = sizeof(struct llog_cookie);
         atomic_set(&mds->mds_real_clients, 0);
 
-        obd->obd_namespace = ldlm_namespace_new(obd->obd_name,
-                                                LDLM_NAMESPACE_SERVER);
+        sprintf(ns_name, "mds-%s", obd->obd_uuid.uuid);
+        obd->obd_namespace = ldlm_namespace_new(ns_name, LDLM_NAMESPACE_SERVER);
+
         if (obd->obd_namespace == NULL) {
                 mds_cleanup(obd, 0);
                 GOTO(err_put, rc = -ENOMEM);
@@ -2270,7 +2302,8 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
 
         rc = mds_fs_setup(obd, mnt);
         if (rc) {
-                CERROR("MDS filesystem method init failed: rc = %d\n", rc);
+                CERROR("%s: MDS filesystem method init failed: rc = %d\n",
+                       obd->obd_name, rc);
                 GOTO(err_ns, rc);
         }
 
@@ -2384,7 +2417,8 @@ int mds_postrecov(struct obd_device *obd)
 {
         struct mds_obd *mds = &obd->u.mds;
         struct llog_ctxt *ctxt;
-        int rc, item = 0;
+        int rc, item = 0, valsize;
+         __u32 group;
         ENTRY;
 
         LASSERT(!obd->obd_recovering);
@@ -2404,6 +2438,13 @@ int mds_postrecov(struct obd_device *obd)
                 GOTO(out, rc);
         item = rc;
 
+        group = FILTER_GROUP_FIRST_MDS + mds->mds_num;
+        valsize = sizeof(group);
+        rc = obd_set_info(mds->mds_osc_exp, strlen("mds_conn"), "mds_conn",
+                          valsize, &group);
+        if (rc)
+                GOTO(out, rc);
+
         rc = llog_connect(ctxt, obd->u.mds.mds_lov_desc.ld_tgt_count,
                           NULL, NULL, NULL);
         if (rc) {
@@ -2531,6 +2572,7 @@ static int mds_cleanup(struct obd_device *obd, int flags)
 static void fixup_handle_for_resent_req(struct ptlrpc_request *req,
                                         int offset,
                                         struct ldlm_lock *new_lock,
+                                        struct ldlm_lock **old_lock,
                                         struct lustre_handle *lockh)
 {
         struct obd_export *exp = req->rq_export;
@@ -2551,8 +2593,11 @@ static void fixup_handle_for_resent_req(struct ptlrpc_request *req,
                         continue;
                 if (lock->l_remote_handle.cookie == remote_hdl.cookie) {
                         lockh->cookie = lock->l_handle.h_cookie;
+                        LDLM_DEBUG(lock, "restoring lock cookie");
                         DEBUG_REQ(D_HA, req, "restoring lock cookie "LPX64,
                                   lockh->cookie);
+                        if (old_lock)
+                                *old_lock = LDLM_LOCK_GET(lock);
                         l_unlock(&obd->obd_namespace->ns_lock);
                         return;
                 }
@@ -2599,7 +2644,7 @@ static int mds_intent_policy(struct ldlm_namespace *ns,
         struct mds_obd *mds = &req->rq_export->exp_obd->u.mds;
         struct ldlm_reply *rep;
         struct lustre_handle lockh[2] = {{0}, {0}};
-        struct ldlm_lock *new_lock;
+        struct ldlm_lock *new_lock = NULL;
         int getattr_part = MDS_INODELOCK_UPDATE;
         int rc, repsize[4] = { sizeof(struct ldlm_reply),
                                sizeof(struct mds_body),
@@ -2634,8 +2679,6 @@ static int mds_intent_policy(struct ldlm_namespace *ns,
         rep = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*rep));
         intent_set_disposition(rep, DISP_IT_EXECD);
 
-        fixup_handle_for_resent_req(req, MDS_REQ_INTENT_LOCKREQ_OFF,
-                                    lock, lockh);
 
         /* execute policy */
         switch ((long)it->opc) {
@@ -2643,6 +2686,8 @@ static int mds_intent_policy(struct ldlm_namespace *ns,
         case IT_CREAT|IT_OPEN:
                 /* XXX swab here to assert that an mds_open reint
                  * packet is following */
+                fixup_handle_for_resent_req(req, MDS_REQ_INTENT_LOCKREQ_OFF, 
+                                            lock, NULL, lockh);
                 rep->lock_policy_res2 = mds_reint(req, offset, lockh);
 #if 0
                 /* We abort the lock if the lookup was negative and
@@ -2663,7 +2708,9 @@ static int mds_intent_policy(struct ldlm_namespace *ns,
         case IT_GETATTR:
                 getattr_part |= MDS_INODELOCK_LOOKUP;
         case IT_READDIR:
-                rep->lock_policy_res2 = mds_getattr_name(req, offset, lockh,
+                fixup_handle_for_resent_req(req, MDS_REQ_INTENT_LOCKREQ_OFF, 
+                                            lock, &new_lock, lockh);
+                rep->lock_policy_res2 = mds_getattr_lock(req, offset, lockh,
                                                          getattr_part);
                 /* FIXME: LDLM can set req->rq_status. MDS sets
                    policy_res{1,2} with disposition and status.
@@ -2699,11 +2746,14 @@ static int mds_intent_policy(struct ldlm_namespace *ns,
          * drop it below anyways because lock replay is done separately by the
          * client afterwards.  For regular RPCs we want to give the new lock to
          * the client instead of whatever lock it was about to get. */
-        new_lock = ldlm_handle2lock(&lockh[0]);
+        if (new_lock == NULL)
+                new_lock = ldlm_handle2lock(&lockh[0]);
         if (new_lock == NULL && (flags & LDLM_FL_INTENT_ONLY))
                 RETURN(0);
 
-        LASSERT(new_lock != NULL);
+        LASSERTF(new_lock != NULL, "op "LPX64" lockh "LPX64"\n",
+                 it->opc, lockh[0].cookie);
+ 
 
         /* If we've already given this lock to a client once, then we should
          * have no readers or writers.  Otherwise, we should have one reader
diff --git a/lustre/mds/lproc_mds.c b/lustre/mds/lproc_mds.c
index 27633ae050..853217c0fe 100644
--- a/lustre/mds/lproc_mds.c
+++ b/lustre/mds/lproc_mds.c
@@ -103,64 +103,6 @@ static int lprocfs_mds_rd_mntdev(char *page, char **start, off_t off, int count,
         return snprintf(page, count, "%s\n",obd->u.mds.mds_vfsmnt->mnt_devname);
 }
 
-static int lprocfs_mds_rd_recovery_status(char *page, char **start, off_t off,
-                                          int count, int *eof, void *data)
-{
-        struct obd_device *obd = data;
-        int len = 0, n,
-                connected = obd->obd_connected_clients,
-                max_recoverable = obd->obd_max_recoverable_clients,
-                recoverable = obd->obd_recoverable_clients,
-                completed = max_recoverable - recoverable,
-                queue_len = obd->obd_requests_queued_for_recovery,
-                replayed = obd->obd_replayed_requests;
-        __u64 next_transno = obd->obd_next_recovery_transno;
-
-        LASSERT(obd != NULL);
-        *eof = 1;
-
-        n = snprintf(page, count, "status: ");
-        page += n; len += n; count -= n;
-        if (obd->obd_max_recoverable_clients == 0) {
-                n = snprintf(page, count, "INACTIVE\n");
-                return len + n;
-        }
-
-        if (obd->obd_recoverable_clients == 0) {
-                n = snprintf(page, count, "COMPLETE\n");
-                page += n; len += n; count -= n;
-                n = snprintf(page, count, "recovered_clients: %d\n",
-                             max_recoverable);
-                page += n; len += n; count -= n;
-                n = snprintf(page, count, "last_transno: "LPD64"\n",
-                             next_transno - 1);
-                page += n; len += n; count -= n;
-                n = snprintf(page, count, "replayed_requests: %d\n", replayed);
-                return len + n;
-        }
-
-        /* sampled unlocked, but really... */
-        if (obd->obd_recovering == 0) {
-                n = snprintf(page, count, "ABORTED\n");
-                return len + n;
-        }
-
-        n = snprintf(page, count, "RECOVERING\n");
-        page += n; len += n; count -= n;
-        n = snprintf(page, count, "connected_clients: %d/%d\n",
-                     connected, max_recoverable);
-        page += n; len += n; count -= n;
-        n = snprintf(page, count, "completed_clients: %d/%d\n",
-                     completed, max_recoverable);
-        page += n; len += n; count -= n;
-        n = snprintf(page, count, "replayed_requests: %d/??\n", replayed);
-        page += n; len += n; count -= n;
-        n = snprintf(page, count, "queued_requests: %d\n", queue_len);
-        page += n; len += n; count -= n;
-        n = snprintf(page, count, "next_transno: "LPD64"\n", next_transno);
-        return len + n;
-}
-
 static int lprocfs_rd_mds_counters(char *page, char **start, off_t off,
                                           int count, int *eof, void *data)
 {
@@ -260,7 +202,7 @@ struct lprocfs_vars lprocfs_mds_obd_vars[] = {
         { "filestotal",   lprocfs_rd_filestotal,  0, 0 },
         { "filesfree",    lprocfs_rd_filesfree,   0, 0 },
         { "mntdev",       lprocfs_mds_rd_mntdev,  0, 0 },
-        { "recovery_status", lprocfs_mds_rd_recovery_status, 0, 0 },
+        { "recovery_status", lprocfs_obd_rd_recovery_status, 0, 0 },
         { "evict_client", 0, lprocfs_mds_wr_evict_client, 0 },
         { "config_update", 0, lprocfs_mds_wr_config_update, 0 },
         { "num_exports",  lprocfs_rd_num_exports, 0, 0 },
diff --git a/lustre/mds/mds_fs.c b/lustre/mds/mds_fs.c
index 1d798439b0..712b206ad7 100644
--- a/lustre/mds/mds_fs.c
+++ b/lustre/mds/mds_fs.c
@@ -345,7 +345,8 @@ static int mds_read_last_rcvd(struct obd_device *obd, struct file *file)
                 if (last_transno > mds->mds_last_transno)
                        mds->mds_last_transno = last_transno;
         }
-
+        if (mcd)
+                OBD_FREE(mcd, sizeof(*mcd));
         obd->obd_last_committed = mds->mds_last_transno;
         if (obd->obd_recoverable_clients) {
                 CWARN("RECOVERY: service %s, %d recoverable clients, "
@@ -353,18 +354,18 @@ static int mds_read_last_rcvd(struct obd_device *obd, struct file *file)
                       obd->obd_recoverable_clients, mds->mds_last_transno);
                 obd->obd_next_recovery_transno = obd->obd_last_committed + 1;
                 target_start_recovery_thread(obd, mds_handle);
+                obd->obd_recovery_start = LTIME_S(CURRENT_TIME);
         }
-
-        if (mcd)
-                OBD_FREE(mcd, sizeof(*mcd));
         
         mds->mds_mount_count = mount_count + 1;
         msd->msd_mount_count = cpu_to_le64(mds->mds_mount_count);
 
         /* save it, so mount count and last_transno is current */
         rc = mds_update_server_data(obd, 1);
+        if (rc)
+                GOTO(err_client, rc);
 
-        RETURN(rc);
+        RETURN(0);
 
 err_client:
         class_disconnect_exports(obd, 0);
@@ -569,6 +570,7 @@ int mds_fs_cleanup(struct obd_device *obd, int flags)
                        " be preserved.\n", obd->obd_name);
 
         class_disconnect_exports(obd, flags); /* cleans up client info too */
+        target_cleanup_recovery(obd);
         mds_server_free_data(mds);
 
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
@@ -753,12 +755,12 @@ int mds_obd_destroy(struct obd_export *exp, struct obdo *oa,
 
         down(&parent_inode->i_sem);
         de = lookup_one_len(fidname, mds->mds_objects_dir, namelen);
-        if (de == NULL || de->d_inode == NULL) {
-                CERROR("destroying non-existent object "LPU64" %s\n", 
-                       oa->o_id, fidname);
-                GOTO(out_dput, rc = IS_ERR(de) ? PTR_ERR(de) : -ENOENT);
+        if (IS_ERR(de) || de->d_inode == NULL) {
+                rc = IS_ERR(de) ? PTR_ERR(de) : -ENOENT;
+                CERROR("destroying non-existent object "LPU64" %s: rc %d\n",
+                       oa->o_id, fidname, rc);
+                GOTO(out_dput, rc);
         }
-
         /* Stripe count is 1 here since this is some MDS specific stuff
            that is unlinked, not spanned across multiple OSTs */
         handle = fsfilt_start_log(obd, mds->mds_objects_dir->d_inode,
diff --git a/lustre/mds/mds_internal.h b/lustre/mds/mds_internal.h
index d713031848..3d4750ead7 100644
--- a/lustre/mds/mds_internal.h
+++ b/lustre/mds/mds_internal.h
@@ -57,6 +57,45 @@ void lprocfs_free_mds_counters(struct lprocfs_stats *ptr);
         lprocfs_counter_incr(mds->mds_counters, opcode);
 #endif
 
+#ifdef __KERNEL__
+/* Open counts for files.  No longer atomic, must hold inode->i_sem */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+# define mds_inode_oatomic(inode)    ((inode)->i_cindex)
+#else
+# define mds_inode_oatomic(inode)    ((inode)->i_attr_flags)
+#endif
+
+static inline int mds_orphan_open_count(struct inode *inode)
+{
+        LASSERT_MDS_ORPHAN_READ_LOCKED(inode);
+        return mds_inode_oatomic(inode);
+}
+
+static inline int mds_orphan_open_inc(struct inode *inode)
+{
+        LASSERT_MDS_ORPHAN_WRITE_LOCKED(inode);
+        return ++mds_inode_oatomic(inode);
+}
+
+static inline int mds_orphan_open_dec_test(struct inode *inode)
+{
+        LASSERT_MDS_ORPHAN_WRITE_LOCKED(inode);
+        return --mds_inode_oatomic(inode) == 0;
+}
+
+#define mds_inode_is_orphan(inode)  ((inode)->i_flags & 0x4000000)
+#define mds_inode_set_orphan(inode)                                     \
+do {                                                                    \
+        (inode)->i_flags |= 0x4000000;                                  \
+        CDEBUG(D_VFSTRACE, "setting orphan flag on inode %p\n", inode); \
+} while (0)
+#define mds_inode_unset_orphan(inode)                                      \
+do {                                                                       \
+        (inode)->i_flags &= ~(0x4000000);                                  \
+        CDEBUG(D_VFSTRACE, "removing orphan flag from inode %p\n", inode); \
+} while (0)
+#endif /* __KERNEL__ */
+
 /* mds/mds_reint.c */
 int enqueue_ordered_locks(struct obd_device *obd, struct ldlm_res_id *p1_res_id,
                           struct lustre_handle *p1_lockh, int p1_lock_mode,
@@ -77,7 +116,7 @@ int mds_get_parent_child_locked(struct obd_device *obd, struct mds_obd *mds,
                                 char *name, int namelen,
                                 struct lustre_handle *child_lockh,
                                 struct dentry **dchildp, int child_mode,
-                                __u64 child_lockpart, void* clone_info);
+                                __u64 child_lockpart);
 int mds_lock_new_child(struct obd_device *obd, struct inode *inode,
                        struct lustre_handle *child_lockh);
 
@@ -89,9 +128,6 @@ int mds_init_ucred(struct lvfs_ucred *ucred, struct mds_req_sec_desc *rsd);
 void mds_exit_ucred(struct lvfs_ucred *ucred);
 
 /* mds/mds_unlink_open.c */
-int mds_open_unlink_rename(struct mds_update_record *rec,
-                           struct obd_device *obd, struct dentry *dparent,
-                           struct dentry *dchild, void **handle);
 int mds_cleanup_orphans(struct obd_device *obd);
 
 
diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c
index fde51b0a5a..0e2f69ddd1 100644
--- a/lustre/mds/mds_lib.c
+++ b/lustre/mds/mds_lib.c
@@ -47,10 +47,7 @@
 
 #include <linux/obd_support.h>
 #include <linux/lustre_lib.h>
-#include <linux/lustre_mds.h>
-
-#include <linux/lustre_smfs.h>
-#include <linux/lustre_snap.h>
+#include "mds_internal.h"
 
 #include "mds_internal.h"
 
diff --git a/lustre/mds/mds_lmv.c b/lustre/mds/mds_lmv.c
index 0500bfeef3..df80c75c9a 100644
--- a/lustre/mds/mds_lmv.c
+++ b/lustre/mds/mds_lmv.c
@@ -238,7 +238,7 @@ static int dc_new_page_to_cache(struct dir_cache * dirc)
         page = alloc_page(GFP_KERNEL);
         if (page == NULL)
                 return -ENOMEM;
-        list_add_tail(&page->list, &dirc->list);
+        list_add_tail(&page->lru, &dirc->list);
         dirc->cur = page_address(page);
         dirc->free = PAGE_SIZE;
         return 0;
@@ -301,13 +301,13 @@ static int flush_buffer_onto_mds(struct dirsplit_control *dc, int mdsnum)
         list_for_each_safe(cur, tmp, &ca->list) {
                 struct page *page;
 
-                page = list_entry(cur, struct page, list);
+                page = list_entry(cur, struct page, lru);
                 LASSERT(page != NULL);
 
                 retrieve_generation_numbers(dc, page_address(page));
 
                 ca->brwc.pg = page;
-                ca->brwc.off = 0;
+                ca->brwc.disk_offset = ca->brwc.page_offset = 0;
                 ca->brwc.count = PAGE_SIZE;
                 ca->brwc.flag = 0;
                 ca->oa.o_mds = mdsnum;
@@ -334,7 +334,7 @@ static int remove_entries_from_orig_dir(struct dirsplit_control *dc, int mdsnum)
 
         ca = dc->cache + mdsnum;
         list_for_each_safe(cur, tmp, &ca->list) {
-                page = list_entry(cur, struct page, list);
+                page = list_entry(cur, struct page, lru);
                 buf = page_address(page);
                 end = buf + PAGE_SIZE;
 
@@ -478,8 +478,8 @@ cleanup:
                         continue;
                 list_for_each_safe(cur, tmp, &dc.cache[i].list) {
                         struct page *page;
-                        page = list_entry(cur, struct page, list);
-                        list_del(&page->list);
+                        page = list_entry(cur, struct page, lru);
+                        list_del(&page->lru);
                         __free_page(page);
                 }
         }
diff --git a/lustre/mds/mds_lov.c b/lustre/mds/mds_lov.c
index a1ece502bd..322109d3c9 100644
--- a/lustre/mds/mds_lov.c
+++ b/lustre/mds/mds_lov.c
@@ -218,9 +218,7 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name)
 {
         struct mds_obd *mds = &obd->u.mds;
         struct lustre_handle conn = {0,};
-        char name[32] = "CATLIST";
-        int rc, i, valsize;
-        __u32 group;
+        int rc, i;
         ENTRY;
 
         if (IS_ERR(mds->mds_osc_obd))
@@ -232,8 +230,7 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name)
         spin_lock_init(&mds->mds_lov_lock);
         mds->mds_osc_obd = class_name2obd(lov_name);
         if (!mds->mds_osc_obd) {
-                CERROR("MDS cannot locate LOV %s\n",
-                       lov_name);
+                CERROR("MDS cannot locate LOV %s\n", lov_name);
                 mds->mds_osc_obd = ERR_PTR(-ENOTCONN);
                 RETURN(-ENOTCONN);
         }
@@ -244,8 +241,7 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name)
         rc = obd_connect(&conn, mds->mds_osc_obd, &obd->obd_uuid,
                          mds->mds_num + FILTER_GROUP_FIRST_MDS);
         if (rc) {
-                CERROR("MDS cannot connect to LOV %s (%d)\n",
-                       lov_name, rc);
+                CERROR("MDS cannot connect to LOV %s (%d)\n", lov_name, rc);
                 mds->mds_osc_obd = ERR_PTR(rc);
                 RETURN(rc);
         }
@@ -269,20 +265,12 @@ int mds_lov_connect(struct obd_device *obd, char * lov_name)
         }
 
         rc = obd_llog_cat_initialize(obd, &obd->obd_llogs, 
-                                     mds->mds_lov_desc.ld_tgt_count, name);
+                                     mds->mds_lov_desc.ld_tgt_count, CATLIST);
         if (rc) {
                 CERROR("failed to initialize catalog %d\n", rc);
                 GOTO(err_reg, rc);
         }
 
-        /* FIXME before set info call is made, we must initialize logging */
-        group = FILTER_GROUP_FIRST_MDS + mds->mds_num;
-        valsize = sizeof(group);
-        rc = obd_set_info(mds->mds_osc_exp, strlen("mds_conn"), "mds_conn",
-                          valsize, &group);
-        if (rc)
-                GOTO(err_reg, rc);
-
         /* If we're mounting this code for the first time on an existing FS,
          * we need to populate the objids array from the real OST values */
         if (!mds->mds_lov_objids_valid) {
@@ -496,8 +484,8 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         case OBD_IOC_LLOG_REMOVE: {
                 struct llog_ctxt *ctxt =
                         llog_get_context(&obd->obd_llogs, LLOG_CONFIG_ORIG_CTXT);
-                char name[32] = "CATLIST";
-                int rc2;
+                int rc2, valsize;
+                __u32 group;
 
                 obd_llog_finish(obd, &obd->obd_llogs,
                                 mds->mds_lov_desc.ld_tgt_count);
@@ -506,9 +494,11 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                 pop_ctxt(&saved, ctxt->loc_lvfs_ctxt, NULL);
                 obd_llog_cat_initialize(obd, &obd->obd_llogs, 
                                         mds->mds_lov_desc.ld_tgt_count,
-                                        name);
+                                        CATLIST);
+                group = FILTER_GROUP_FIRST_MDS + mds->mds_num;
+                valsize = sizeof(group);
                 rc2 = obd_set_info(mds->mds_osc_exp, strlen("mds_conn"),
-                                   "mds_conn", 0, NULL);
+                                   "mds_conn", valsize, &group);
                 if (!rc)
                         rc = rc2;
                 RETURN(rc);
@@ -818,8 +808,8 @@ int mds_convert_lov_ea(struct obd_device *obd, struct inode *inode,
         if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC)
                 RETURN(0);
 
-        CWARN("converting LOV EA on %lu/%u from V0 to V1\n",
-              inode->i_ino, inode->i_generation);
+        CDEBUG(D_INODE, "converting LOV EA on %lu/%u from V0 to V1\n",      
+                inode->i_ino, inode->i_generation);
         rc = obd_unpackmd(obd->u.mds.mds_osc_exp, &lsm, lmm, lmm_size);
         if (rc < 0)
                 GOTO(conv_end, rc);
diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c
index 5ee66bc668..eb0abebac7 100644
--- a/lustre/mds/mds_open.c
+++ b/lustre/mds/mds_open.c
@@ -40,7 +40,6 @@
 #endif
 
 #include <linux/obd_class.h>
-#include <linux/lustre_mds.h>
 #include <linux/obd_lov.h>
 #include <linux/lustre_fsfilt.h>
 #include <linux/lprocfs_status.h>
@@ -233,7 +232,7 @@ int mds_query_write_access(struct inode *inode)
         RETURN(atomic_read(&inode->i_writecount));
 }
 
-/* This replaces the VFS mds_dentry_open, it manages mfd and writecount */
+/* This replaces the VFS dentry_open, it manages mfd and writecount */
 static struct mds_file_data *mds_dentry_open(struct dentry *dentry,
                                              struct vfsmount *mnt, int flags,
                                              struct ptlrpc_request *req)
@@ -268,7 +267,10 @@ static struct mds_file_data *mds_dentry_open(struct dentry *dentry,
         dget(dentry);
 
         /* Mark the file as open to handle open-unlink. */
-        mds_open_orphan_inc(dentry->d_inode);
+
+        DOWN_WRITE_I_ALLOC_SEM(dentry->d_inode);
+        mds_orphan_open_inc(dentry->d_inode);
+        UP_WRITE_I_ALLOC_SEM(dentry->d_inode);
 
         mfd->mfd_mode = flags;
         mfd->mfd_dentry = dentry;
@@ -307,7 +309,7 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
                               struct dentry *dchild, void **handle, 
                               obd_id **ids)
 {
-        struct obdo *oa;
+        struct obdo *oa = NULL;
         struct obd_trans_info oti = { 0 };
         struct mds_body *body;
         struct lov_stripe_md *lsm = NULL;
@@ -334,7 +336,7 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
         oti.oti_objid = *ids;
 
         /* replay case */
-        if(lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
+        if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
                 LASSERT (rec->ur_fid2->id);
                 body->valid |= OBD_MD_FLBLKSZ | OBD_MD_FLEASIZE;
                 lmm_size = rec->ur_eadatalen;
@@ -346,7 +348,7 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
                 if (IS_ERR(*handle)) {
                         rc = PTR_ERR(*handle);
                         *handle = NULL;
-                        GOTO(out_ids, rc);
+                        GOTO(out_oa, rc);
                 }
 
                 mds_objids_from_lmm(*ids, lmm, &mds->mds_lov_desc);
@@ -483,7 +485,7 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
         struct mds_obd *mds = mds_req2mds(req);
         struct mds_file_data *mfd;
         struct obd_device *obd = req->rq_export->exp_obd;
-        struct dentry *parent, *child;
+        struct dentry *parent, *dchild;
         struct ldlm_reply *rep;
         struct mds_body *body;
         int rc;
@@ -509,12 +511,12 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
         LASSERTF(!IS_ERR(parent), "fid "LPU64"/%u rc %ld\n", rec->ur_fid1->id,
                  rec->ur_fid1->generation, PTR_ERR(parent));
 
-        child = ll_lookup_one_len(rec->ur_name, parent, rec->ur_namelen - 1);
-        LASSERTF(!IS_ERR(child), "parent "LPU64"/%u child %s rc %ld\n",
+        dchild = ll_lookup_one_len(rec->ur_name, parent, rec->ur_namelen - 1);
+        LASSERTF(!IS_ERR(dchild), "parent "LPU64"/%u child %s rc %ld\n",
                  rec->ur_fid1->id, rec->ur_fid1->generation, rec->ur_name,
-                 PTR_ERR(child));
+                 PTR_ERR(dchild));
 
-        if (!child->d_inode)
+        if (!dchild->d_inode)
                 GOTO(out_dput, 0); /* child not present to open */
 
         /* At this point, we know we have a child. We'll send
@@ -524,11 +526,11 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
             req->rq_status)
                 GOTO(out_dput, 0);
 
-        mds_pack_inode2fid(obd, &body->fid1, child->d_inode);
-        mds_pack_inode2body(obd, body, child->d_inode);
-        if (S_ISREG(child->d_inode->i_mode)) {
+        mds_pack_inode2fid(obd, &body->fid1, dchild->d_inode);
+        mds_pack_inode2body(obd, body, dchild->d_inode);
+        if (S_ISREG(dchild->d_inode->i_mode)) {
                 rc = mds_pack_md(obd, req->rq_repmsg, 2, body,
-                                 child->d_inode, 1);
+                                 dchild->d_inode, 1);
 
                 if (rc)
                         LASSERT(rc == req->rq_status);
@@ -537,13 +539,8 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
                 if (!(body->valid & OBD_MD_FLEASIZE))
                         body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
                                         OBD_MD_FLATIME | OBD_MD_FLMTIME);
-        } else {
-                /* XXX need to check this case */
         }
-
-        /* If we're opening a file without an EA, change to a write
-           lock (unless we already have one). */
-
+        
         /* If we have -EEXIST as the status, and we were asked to create
          * exclusively, we can tell we failed because the file already existed.
          */
@@ -580,7 +577,7 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
         if (mfd == NULL) {
                 mntget(mds->mds_vfsmnt);
                 CERROR("Re-opened file \n");
-                mfd = mds_dentry_open(child, mds->mds_vfsmnt,
+                mfd = mds_dentry_open(dchild, mds->mds_vfsmnt,
                                       rec->ur_flags & ~MDS_OPEN_TRUNC, req);
                 if (!mfd) {
                         CERROR("mds: out of memory\n");
@@ -595,7 +592,7 @@ static void reconstruct_open(struct mds_update_record *rec, int offset,
 
  out_dput:
         if (put_child)
-                l_dput(child);
+                l_dput(dchild);
         l_dput(parent);
         EXIT;
 }
@@ -641,12 +638,20 @@ static int mds_finish_open(struct ptlrpc_request *req, struct dentry *dchild,
         }
         if (rec != NULL) {
                 /* no EA: create objects */
-                rc = mds_create_objects(req, 2, rec, mds, obd,
-                                        dchild, handle, &ids);
-                if (rc) {
-                        CERROR("mds_create_objects: rc = %d\n", rc);
+                if ((body->valid & OBD_MD_FLEASIZE) &&
+                    (rec->ur_flags & MDS_OPEN_HAS_EA)) {
                         up(&dchild->d_inode->i_sem);
-                        RETURN(rc);
+                        RETURN(-EEXIST);
+                }
+                if (!(body->valid & OBD_MD_FLEASIZE)) {
+                        /* no EA: create objects */
+                        rc = mds_create_objects(req, 2, rec, mds, obd,
+                                                dchild, handle, &ids);
+                        if (rc) {
+                                CERROR("mds_create_objects: rc = %d\n", rc);
+                                up(&dchild->d_inode->i_sem);
+                                RETURN(rc);
+                        }
                 }
                 if (S_ISREG(dchild->d_inode->i_mode) &&
                     (body->valid & OBD_MD_FLEASIZE)) {
@@ -851,7 +856,6 @@ int mds_open(struct mds_update_record *rec, int offset,
          * opened this file and is only replaying the RPC, so we open the
          * inode by fid (at some large expense in security). */
         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
-                DEBUG_REQ(D_HA, req, "open replay");
                 CDEBUG(D_HA, "open fid "LPU64"/%u name %*s mode %o\n",
                           rec->ur_fid2->id, rec->ur_fid2->generation,
                           rec->ur_namelen - 1, rec->ur_name, rec->ur_mode);
@@ -908,7 +912,8 @@ int mds_open(struct mds_update_record *rec, int offset,
                                         MDS_INODELOCK_UPDATE);
         if (IS_ERR(dparent)) {
                 rc = PTR_ERR(dparent);
-                CERROR("parent lookup error %d\n", rc);
+                if (rc != -ENOENT)
+                        CERROR("parent lookup error %d\n", rc);
                 GOTO(cleanup, rc);
         }
         LASSERT(dparent->d_inode != NULL);
@@ -1073,8 +1078,9 @@ got_child:
 
                 acc_mode = 0;           /* Don't check for permissions */
         }
-
-        LASSERT(!mds_inode_is_orphan(dchild->d_inode));
+        LASSERTF(!mds_inode_is_orphan(dchild->d_inode),
+                 "dchild %*s (%p) inode %p\n", dchild->d_name.len,
+                 dchild->d_name.name, dchild, dchild->d_inode);
 
         mds_pack_inode2fid(obd, &body->fid1, dchild->d_inode);
         mds_pack_inode2body(obd, body, dchild->d_inode);
@@ -1173,7 +1179,7 @@ got_child:
 }
 
 /* Close a "file descriptor" and possibly unlink an orphan from the
- * PENDING directory.
+ * PENDING directory.  Caller must hold child->i_sem, this drops it. 
  *
  * If we are being called from mds_disconnect() because the client has
  * disappeared, then req == NULL and we do not update last_rcvd because
@@ -1206,9 +1212,11 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
                                             sizeof(*reply_body));
 
         fidlen = ll_fid2str(fidname, inode->i_ino, inode->i_generation);
-
-        last_orphan = mds_open_orphan_dec_test(inode) &&
-                mds_inode_is_orphan(inode);
+        CDEBUG(D_INODE, "inode %p ino %s nlink %d orphan %d\n", inode, fidname,
+               inode->i_nlink, mds_orphan_open_count(inode));
+        last_orphan = mds_orphan_open_dec_test(inode) &&
+                      mds_inode_is_orphan(inode);
+        UP_WRITE_I_ALLOC_SEM(inode);
 
         /* this is half of the actual "close" */
         if (mfd->mfd_mode & FMODE_WRITE) {
@@ -1230,13 +1238,17 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
                 }
 
                 CDEBUG(D_HA, "destroying orphan object %s\n", fidname);
-
+                
+                if ((S_ISREG(inode->i_mode) && inode->i_nlink != 1) ||
+                    (S_ISDIR(inode->i_mode) && inode->i_nlink != 2))
+                        CERROR("found \"orphan\" %s %s with link count %d\n",
+                               S_ISREG(inode->i_mode) ? "file" : "dir",
+                               fidname, inode->i_nlink);
                 /* Sadly, there is no easy way to save pending_child from
                  * mds_reint_unlink() into mfd, so we need to re-lookup,
                  * but normally it will still be in the dcache. */
-                pending_dir = mds->mds_pending_dir->d_inode;
                 down(&pending_dir->i_sem);
-                cleanup_phase = 1; /* up(i_sem) when finished */
+                cleanup_phase = 1;  /* up(&pending_dir->i_sem) when finished */
                 pending_child = lookup_one_len(fidname, mds->mds_pending_dir,
                                                fidlen);
                 if (IS_ERR(pending_child))
@@ -1279,6 +1291,7 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
                 goto out; /* Don't bother updating attrs on unlinked inode */
         }
 
+#if 0
         if (request_body != NULL && mfd->mfd_mode & FMODE_WRITE && rc == 0) {
                 /* Update the on-disk attributes if this was the last write
                  * close, and all information was provided (i.e., rc == 0)
@@ -1286,7 +1299,6 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
                  * XXX this should probably be abstracted with mds_reint_setattr
                  */
 
-#if 0
                 if (request_body->valid & OBD_MD_FLMTIME &&
                     LTIME_S(request_body->mtime) > LTIME_S(inode->i_mtime)) {
                         LTIME_S(iattr.ia_mtime) = LTIME_S(request_body->mtime);
@@ -1308,9 +1320,8 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
                         iattr.ia_blocks = request_body->blocks
                 } */
 
-#endif
         }
-
+#endif
         if (request_body != NULL && request_body->valid & OBD_MD_FLATIME) {
                 /* Only start a transaction to write out only the atime if
                  * it is more out-of-date than the specified limit.  If we
@@ -1414,13 +1425,15 @@ int mds_close(struct ptlrpc_request *req, int offset)
         }
 
         inode = mfd->mfd_dentry->d_inode;
-        if (mds_inode_is_orphan(inode) && mds_open_orphan_count(inode) == 1) {
+        /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
+        DOWN_WRITE_I_ALLOC_SEM(inode); /* mds_mfd_close drops this */
+        if (mds_inode_is_orphan(inode) && mds_orphan_open_count(inode) == 1) {
                 body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body));
                 LASSERT(body != NULL);
 
                 mds_pack_inode2fid(obd, &body->fid1, inode);
                 mds_pack_inode2body(obd, body, inode);
-                mds_pack_md(obd, req->rq_repmsg, 1, body, inode, 1);
+                mds_pack_md(obd, req->rq_repmsg, 1, body, inode, MDS_PACK_MD_LOCK);
         }
         spin_lock(&med->med_open_lock);
         list_del(&mfd->mfd_list);
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index a8af3c6f47..1de982c8ab 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -31,6 +31,8 @@
 #define DEBUG_SUBSYSTEM S_MDS
 
 #include <linux/fs.h>
+#include <linux/jbd.h>
+#include <linux/ext3_fs.h>
 #include <linux/obd_support.h>
 #include <linux/obd_class.h>
 #include <linux/obd.h>
@@ -40,7 +42,6 @@
 #include <linux/lustre_dlm.h>
 #include <linux/lustre_log.h>
 #include <linux/lustre_fsfilt.h>
-
 #include "mds_internal.h"
 
 void mds_commit_cb(struct obd_device *obd, __u64 transno, void *data,
@@ -794,7 +795,7 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 if (rec->ur_tgt == NULL)        /* no target supplied */
                         rc = -EINVAL;           /* -EPROTO? */
                 else
-                        rc = vfs_symlink(dir, dchild, rec->ur_tgt);
+                        rc = ll_vfs_symlink(dir, dchild, rec->ur_tgt, S_IALLUGO);
                 EXIT;
                 break;
         }
@@ -1058,8 +1059,7 @@ int enqueue_4ordered_locks(struct obd_device *obd,struct ldlm_res_id *p1_res_id,
         int rc, i, j, sorted, flags;
         ENTRY;
 
-        CDEBUG(D_DLMTRACE,
-               "locks before: "LPU64"/"LPU64"/"LPU64"/"LPU64"\n",
+        CDEBUG(D_DLMTRACE, "locks before: "LPU64"/"LPU64"/"LPU64"/"LPU64"\n",
                res_id[0]->name[0], res_id[1]->name[0], res_id[2]->name[0],
                res_id[3]->name[0]);
 
@@ -1091,8 +1091,7 @@ int enqueue_4ordered_locks(struct obd_device *obd,struct ldlm_res_id *p1_res_id,
                 policies[j + 1] = policies[4];
         }
 
-        CDEBUG(D_DLMTRACE,
-               "lock order: "LPU64"/"LPU64"/"LPU64"/"LPU64"\n",
+        CDEBUG(D_DLMTRACE, "lock order: "LPU64"/"LPU64"/"LPU64"/"LPU64"\n",
                res_id[0]->name[0], res_id[1]->name[0], res_id[2]->name[0],
                res_id[3]->name[0]);
 
@@ -1248,7 +1247,7 @@ int mds_get_parent_child_locked(struct obd_device *obd, struct mds_obd *mds,
                                 char *name, int namelen,
                                 struct lustre_handle *child_lockh,
                                 struct dentry **dchildp, int child_mode,
-                                __u64 child_lockpart, void *clone_info)
+                                __u64 child_lockpart)
 {
         struct ldlm_res_id child_res_id = { .name = {0} };
         struct ldlm_res_id parent_res_id = { .name = {0} };
@@ -1302,13 +1301,6 @@ int mds_get_parent_child_locked(struct obd_device *obd, struct mds_obd *mds,
 #endif
 
         cleanup_phase = 1; /* parent dentry */
-#ifdef CONFIG_SNAPFS
-        if (clone_info) {
-                /*FIXME is there any other FUNC will use d_fsdata, 
-                 *excepet creating inode according inum*/
-                (*dparentp)->d_fsdata = clone_info;         
-        }
-#endif
 
         /* Step 2: Lookup child (without DLM lock, to get resource name) */
         *dchildp = ll_lookup_one_len(name, *dparentp, namelen - 1);
@@ -1394,6 +1386,85 @@ void mds_reconstruct_generic(struct ptlrpc_request *req)
 
         mds_req_from_mcd(req, med->med_mcd);
 }
+/* If we are unlinking an open file/dir (i.e. creating an orphan) then
+ * we instead link the inode into the PENDING directory until it is
+ * finally released.  We can't simply call mds_reint_rename() or some
+ * part thereof, because we don't have the inode to check for link
+ * count/open status until after it is locked.
+ *
+ * For lock ordering, caller must get child->i_sem first, then pending->i_sem
+ * before starting journal transaction.
+ *
+ * returns 1 on success
+ * returns 0 if we lost a race and didn't make a new link
+ * returns negative on error
+ */
+static int mds_orphan_add_link(struct mds_update_record *rec,
+                               struct obd_device *obd, struct dentry *dentry)
+{
+        struct mds_obd *mds = &obd->u.mds;
+        struct inode *pending_dir = mds->mds_pending_dir->d_inode;
+        struct inode *inode = dentry->d_inode;
+        struct dentry *pending_child;
+        char fidname[LL_FID_NAMELEN];
+        int fidlen = 0, rc, mode;
+        ENTRY;
+
+        LASSERT(inode != NULL);
+        LASSERT(!mds_inode_is_orphan(inode));
+#ifndef HAVE_I_ALLOC_SEM
+        LASSERT(down_trylock(&inode->i_sem) != 0);
+#endif
+        LASSERT(down_trylock(&pending_dir->i_sem) != 0);
+
+        fidlen = ll_fid2str(fidname, inode->i_ino, inode->i_generation);
+
+        CDEBUG(D_INODE, "pending destroy of %dx open %d linked %s %s = %s\n",
+               mds_orphan_open_count(inode), inode->i_nlink,
+               S_ISDIR(inode->i_mode) ? "dir" :
+                S_ISREG(inode->i_mode) ? "file" : "other",rec->ur_name,fidname);
+
+        if (mds_orphan_open_count(inode) == 0 || inode->i_nlink != 0)
+                RETURN(0);
+
+        pending_child = lookup_one_len(fidname, mds->mds_pending_dir, fidlen);
+        if (IS_ERR(pending_child))
+                RETURN(PTR_ERR(pending_child));
+
+        if (pending_child->d_inode != NULL) {
+                CERROR("re-destroying orphan file %s?\n", rec->ur_name);
+                LASSERT(pending_child->d_inode == inode);
+                GOTO(out_dput, rc = 0);
+        }
+
+        /* link() is semanticaly-wrong for S_IFDIR, so we set S_IFREG
+         * for linking and return real mode back then -bzzz */
+        mode = inode->i_mode;
+        inode->i_mode = S_IFREG;
+        rc = vfs_link(dentry, pending_dir, pending_child);
+        if (rc)
+                CERROR("error linking orphan %s to PENDING: rc = %d\n",
+                       rec->ur_name, rc);
+        else
+                mds_inode_set_orphan(inode);
+
+        /* return mode and correct i_nlink if inode is directory */
+        inode->i_mode = mode;
+        LASSERTF(inode->i_nlink == 1, "%s nlink == %d\n",
+                 S_ISDIR(mode) ? "dir" : S_ISREG(mode) ? "file" : "other",
+                 inode->i_nlink);
+        if (S_ISDIR(mode)) {
+                inode->i_nlink++;
+                pending_dir->i_nlink++;
+                mark_inode_dirty(inode);
+                mark_inode_dirty(pending_dir);
+        }
+
+        GOTO(out_dput, rc = 1);
+out_dput:
+        l_dput(pending_child);
+        RETURN(rc);
+}
 
 int mds_create_local_dentry(struct mds_update_record *rec,
                            struct obd_device *obd)
@@ -1622,11 +1693,11 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                             struct ptlrpc_request *req,
                             struct lustre_handle *lh)
 {
-        struct dentry *dparent, *dchild;
+        struct dentry *dparent = NULL, *dchild;
         struct mds_obd *mds = mds_req2mds(req);
         struct obd_device *obd = req->rq_export->exp_obd;
         struct mds_body *body = NULL;
-        struct inode *child_inode;
+        struct inode *child_inode = NULL;
         struct lustre_handle parent_lockh[2] = {{0}, {0}}; 
         struct lustre_handle child_lockh = {0};
 #if 0
@@ -1636,7 +1707,7 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
         struct llog_create_locks *lcl = NULL;
         char fidname[LL_FID_NAMELEN];
         void *handle = NULL;
-        int rc = 0, log_unlink = 0, cleanup_phase = 0;
+        int rc = 0, cleanup_phase = 0;
         int unlink_by_fid = 0;
         int update_mode;
         ENTRY;
@@ -1703,7 +1774,7 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                                  rec->ur_namelen, &child_lockh,
                                                  &dchild, LCK_EX,
                                                  MDS_INODELOCK_LOOKUP |
-                                                 MDS_INODELOCK_UPDATE, NULL);
+                                                 MDS_INODELOCK_UPDATE);
         }
         if (rc)
                 GOTO(cleanup, rc);
@@ -1768,22 +1839,24 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
         body = lustre_msg_buf(req->rq_repmsg, offset, sizeof (*body));
         LASSERT(body != NULL);
 
-        /* If this is the last reference to this inode, get the OBD EA
-         * data first so the client can destroy OST objects.
-         * we only do the object removal if no open files remain.
-         * Nobody can get at this name anymore because of the locks so
-         * we make decisions here as to whether to remove the inode */
-        if (S_ISREG(child_inode->i_mode) && child_inode->i_nlink == 1 &&
-            mds_open_orphan_count(child_inode) == 0) {
-                mds_pack_inode2fid(obd, &body->fid1, child_inode);
-                mds_pack_inode2body(obd, body, child_inode);
-                mds_pack_md(obd, req->rq_repmsg, offset + 1, body,
-                            child_inode, 1);
-                if (!(body->valid & OBD_MD_FLEASIZE)) {
-                        body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
-                                        OBD_MD_FLATIME | OBD_MD_FLMTIME);
-                } else {
-                        log_unlink = 1;
+        /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
+        DOWN_READ_I_ALLOC_SEM(child_inode);
+        cleanup_phase = 4; /* up(&child_inode->i_sem) when finished */
+
+        /* If this is potentially the last reference to this inode, get the
+         * OBD EA data first so the client can destroy OST objects.  We
+         * only do the object removal later if no open files/links remain. */
+        if ((S_ISDIR(child_inode->i_mode) && child_inode->i_nlink == 2) ||
+            child_inode->i_nlink == 1) {
+                if (mds_orphan_open_count(child_inode) > 0) {
+                        /* need to lock pending_dir before transaction */
+                        down(&mds->mds_pending_dir->d_inode->i_sem);
+                        cleanup_phase = 5; /* up(&pending_dir->i_sem) */
+                } else if (S_ISREG(child_inode->i_mode)) {
+                        mds_pack_inode2fid(obd, &body->fid1, child_inode);
+                        mds_pack_inode2body(obd, body, child_inode);
+                        mds_pack_md(obd, req->rq_repmsg, offset + 1, body,
+                                    child_inode, MDS_PACK_MD_LOCK);
                 }
         }
 
@@ -1798,7 +1871,6 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
-                cleanup_phase = 4; /* transaction */
                 rc = vfs_rmdir(dparent->d_inode, dchild);
                 break;
         case S_IFREG: {
@@ -1810,17 +1882,7 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                           le32_to_cpu(lmm->lmm_stripe_count));
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
-
-                cleanup_phase = 4; /* transaction */
                 rc = vfs_unlink(dparent->d_inode, dchild);
-
-                if (!rc && log_unlink)
-                        if (mds_log_op_unlink(obd, child_inode,
-                                lustre_msg_buf(req->rq_repmsg, offset + 1, 0),
-                                req->rq_repmsg->buflens[offset + 1],
-                                lustre_msg_buf(req->rq_repmsg, offset + 2, 0),
-                                req->rq_repmsg->buflens[offset + 2], &lcl) > 0)
-                                body->valid |= OBD_MD_FLCOOKIE;
                 break;
         }
         case S_IFLNK:
@@ -1832,7 +1894,6 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
-                cleanup_phase = 4; /* transaction */
                 rc = vfs_unlink(dparent->d_inode, dchild);
                 break;
         default:
@@ -1842,7 +1903,32 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                 GOTO(cleanup, rc = -EINVAL);
         }
 
- cleanup:
+        if (rc == 0 && child_inode->i_nlink == 0) {
+                if (mds_orphan_open_count(child_inode) > 0)
+                        rc = mds_orphan_add_link(rec, obd, dchild);
+
+                if (rc == 1)
+                        GOTO(cleanup, rc = 0);
+
+                if (!S_ISREG(child_inode->i_mode))
+                        GOTO(cleanup, rc);
+
+                if (!(body->valid & OBD_MD_FLEASIZE)) {
+                        body->valid |=(OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
+                                       OBD_MD_FLATIME | OBD_MD_FLMTIME);
+                } else if (mds_log_op_unlink(obd, child_inode,
+                                lustre_msg_buf(req->rq_repmsg, offset + 1, 0),
+                                        req->rq_repmsg->buflens[offset + 1],
+                                lustre_msg_buf(req->rq_repmsg, offset + 2, 0),
+                                        req->rq_repmsg->buflens[offset+2], 
+                                &lcl) > 0){
+                        body->valid |= OBD_MD_FLCOOKIE;
+                }
+        }
+
+        GOTO(cleanup, rc);
+
+cleanup:
         if (rc == 0) {
                 struct iattr iattr;
                 int err;
@@ -1855,28 +1941,21 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                 if (err)
                         CERROR("error on parent setattr: rc = %d\n", err);
         }
-
+        rc = mds_finish_transno(mds, dparent ? dparent->d_inode : NULL,
+                                handle, req, rc, 0);
+        if (!rc)
+                (void)obd_set_info(mds->mds_osc_exp, strlen("unlinked"),
+                                   "unlinked", 0, NULL);
         switch(cleanup_phase) {
-        case 4:
-                LASSERT(dchild != NULL && dchild->d_inode != NULL);
-                LASSERT(atomic_read(&dchild->d_inode->i_count) > 0);
-                if (rc == 0 && dchild->d_inode->i_nlink == 0 &&
-                                mds_open_orphan_count(dchild->d_inode) > 0) {
-
-                        /* filesystem is really going to destroy an inode
-                         * we have to delay this till inode is opened -bzzz */
-                        mds_open_unlink_rename(rec, obd, dparent, dchild, NULL);
-                }
-                /* handle splitted dir */
+        case 5: /* pending_dir semaphore */
+                up(&mds->mds_pending_dir->d_inode->i_sem);
+        case 4: /* child inode semaphore */
+                UP_READ_I_ALLOC_SEM(child_inode);
+                 /* handle splitted dir */
                 if (rc == 0) {
                         /* master directory can be non-empty or something else ... */
                         mds_unlink_slave_objs(obd, dchild);
                 }
-                rc = mds_finish_transno(mds, dparent->d_inode, handle, req,
-                                        rc, 0);
-                if (!rc)
-                        (void)obd_set_info(mds->mds_osc_exp, strlen("unlinked"),
-                                           "unlinked", 0, NULL);
                 if (lcl != NULL)
                         ptlrpc_save_llog_lock(req, lcl);
         case 3: /* child ino-reuse lock */
@@ -2101,7 +2180,9 @@ static int mds_reint_link(struct mds_update_record *rec, int offset,
         ldlm_policy_data_t tgt_dir_policy =
                                        {.l_inodebits = {MDS_INODELOCK_UPDATE}};
         int rc = 0, cleanup_phase = 0;
+#ifdef S_PDIROPS
         int update_mode = 0;
+#endif
         ENTRY;
 
         LASSERT(offset == 1);
@@ -2250,56 +2331,6 @@ cleanup:
         return 0;
 }
 
-/*
- * add a hard link in the PENDING directory, only used by rename()
- */
-static int mds_add_link_orphan(struct mds_update_record *rec,
-                               struct obd_device *obd,
-                               struct dentry *dentry)
-{
-        struct mds_obd *mds = &obd->u.mds;
-        struct inode *pending_dir = mds->mds_pending_dir->d_inode;
-        struct dentry *pending_child;
-        char fidname[LL_FID_NAMELEN];
-        int fidlen = 0, rc;
-        ENTRY;
-
-        LASSERT(dentry->d_inode);
-        LASSERT(!mds_inode_is_orphan(dentry->d_inode));
-
-        down(&pending_dir->i_sem);
-        fidlen = ll_fid2str(fidname, dentry->d_inode->i_ino,
-                            dentry->d_inode->i_generation);
-
-        CDEBUG(D_ERROR, "pending destroy of %dx open file %s = %s\n",
-               mds_open_orphan_count(dentry->d_inode),
-               rec->ur_name, fidname);
-
-        pending_child = lookup_one_len(fidname, mds->mds_pending_dir, fidlen);
-        if (IS_ERR(pending_child))
-                GOTO(out_lock, rc = PTR_ERR(pending_child));
-
-        if (pending_child->d_inode != NULL) {
-                CERROR("re-destroying orphan file %s?\n", rec->ur_name);
-                LASSERT(pending_child->d_inode == dentry->d_inode);
-                GOTO(out_dput, rc = 0);
-        }
-
-        lock_kernel();
-        rc = vfs_link(dentry, pending_dir, pending_child);
-        unlock_kernel();
-        if (rc)
-                CERROR("error addlink orphan %s to PENDING: rc = %d\n",
-                       rec->ur_name, rc);
-        else
-                mds_inode_set_orphan(dentry->d_inode);
-out_dput:
-        l_dput(pending_child);
-out_lock:
-        up(&pending_dir->i_sem);
-        RETURN(rc);
-}
-
 /* The idea here is that we need to get four locks in the end:
  * one on each parent directory, one on each child.  We need to take
  * these locks in some kind of order (to avoid deadlocks), and the order
@@ -2414,6 +2445,7 @@ static int mds_get_parents_children_locked(struct obd_device *obd,
         cleanup_phase = 4; /* original name dentry */
 
         inode = (*de_oldp)->d_inode;
+        
         if (inode != NULL) {
                 inode = igrab(inode);
                 if (inode == NULL)
@@ -2439,6 +2471,10 @@ static int mds_get_parents_children_locked(struct obd_device *obd,
         cleanup_phase = 5; /* target dentry */
 
         inode = (*de_newp)->d_inode;
+        
+        if (inode == NULL)
+                goto retry_locks;
+        
         if (inode != NULL) {
                 inode = igrab(inode);
                 if (inode == NULL)
@@ -2539,6 +2575,95 @@ cleanup:
 
         return rc;
 }
+                                                                                                                                                                                                     
+static int mds_add_local_dentry(struct mds_update_record *rec, int offset,
+                                struct ptlrpc_request *req, struct dentry *dentry,
+                                struct dentry *de_dir, 
+                                struct dentry *de)
+{
+        struct obd_device *obd = req->rq_export->exp_obd;
+        struct mds_obd *mds = mds_req2mds(req);
+        void *handle = NULL;
+        int rc = 0;
+        ENTRY;
+                                                                                                                                                                                                     
+        if (de->d_inode) {
+                /*
+                 * name exists and points to local inode try to unlink this name
+                 * and create new one.
+                 */
+                CDEBUG(D_OTHER, "%s: %s points to local inode %lu/%lu\n",
+                       obd->obd_name, rec->ur_tgt,
+                       (unsigned long)de->d_inode->i_ino,
+                       (unsigned long)de->d_inode->i_generation);
+                handle = fsfilt_start(obd, de_dir->d_inode,
+                                      FSFILT_OP_RENAME, NULL);
+                if (IS_ERR(handle))
+                        GOTO(cleanup, rc = PTR_ERR(handle));
+                rc = fsfilt_del_dir_entry(req->rq_export->exp_obd, de);
+                if (rc)
+                        GOTO(cleanup, rc);
+        } else if (de->d_flags & DCACHE_CROSS_REF) {
+                /* name exists and points to remove inode */
+                CDEBUG(D_OTHER, "%s: %s points to remote inode %lu/%lu/%lu\n",
+                       obd->obd_name, rec->ur_tgt, (unsigned long)de->d_mdsnum,
+                       (unsigned long)de->d_inum, 
+                       (unsigned long)de->d_generation);
+                handle = fsfilt_start(obd, de_dir->d_inode,
+                                      FSFILT_OP_RENAME, NULL);
+                if (IS_ERR(handle))
+                        GOTO(cleanup, rc = PTR_ERR(handle));
+                rc = fsfilt_del_dir_entry(req->rq_export->exp_obd, de);
+                if (rc)
+                        GOTO(cleanup, rc);
+        } else {
+                /* name doesn't exist. the simplest case. */
+                handle = fsfilt_start(obd, de_dir->d_inode,
+                                      FSFILT_OP_LINK, NULL);
+                if (IS_ERR(handle))
+                        GOTO(cleanup, rc = PTR_ERR(handle));
+        }
+                                                                                                                                                                                                     
+        rc = fsfilt_add_dir_entry(obd, de_dir, rec->ur_tgt,
+                                  rec->ur_tgtlen - 1, dentry->d_inum,
+                                  dentry->d_generation, dentry->d_mdsnum);
+        if (rc) {
+                CERROR("add_dir_entry() returned error %d\n", rc);
+                GOTO(cleanup, rc);
+        }
+                                                                                                                                                                                                     
+cleanup:
+        EXIT;
+        rc = mds_finish_transno(mds, de_dir ? de_dir->d_inode : NULL,
+                                handle, req, rc, 0);
+                                                                                                                                                                                                     
+        RETURN(rc);
+}
+
+static int mds_del_local_dentry(struct mds_update_record *rec, int offset,
+                                struct ptlrpc_request *req, 
+                                struct dentry *dentry, struct dentry *de_dir, 
+                                struct dentry *de)
+{
+        struct obd_device *obd = req->rq_export->exp_obd;
+        struct mds_obd *mds = mds_req2mds(req);
+        void *handle = NULL;
+        int rc = 0;
+        ENTRY;
+                                                                                                                                                                                                     
+        handle = fsfilt_start(obd, de_dir->d_inode, FSFILT_OP_UNLINK, NULL);
+        if (IS_ERR(handle))
+                GOTO(cleanup, rc = PTR_ERR(handle));
+        rc = fsfilt_del_dir_entry(obd, de);
+        d_drop(de);
+                                                                                                                                                                                                     
+cleanup:
+        EXIT;
+        rc = mds_finish_transno(mds, de_dir ? de_dir->d_inode : NULL,
+                                handle, req, rc, 0);
+        RETURN(0);
+}
+
 
 static int mds_reint_rename_create_name(struct mds_update_record *rec,
                                         int offset, struct ptlrpc_request *req)
@@ -2570,7 +2695,7 @@ static int mds_reint_rename_create_name(struct mds_update_record *rec,
                                          &de_srcdir,LCK_PW,MDS_INODELOCK_UPDATE,
                                          &update_mode, rec->ur_tgt, rec->ur_tgtlen,
                                          &child_lockh, &de_new, LCK_EX,
-                                         MDS_INODELOCK_LOOKUP, NULL);
+                                         MDS_INODELOCK_LOOKUP);
         if (rc)
                 GOTO(cleanup, rc);
 
@@ -2652,7 +2777,6 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset,
         struct lustre_handle parent_lockh[2] = {{0}, {0}};
         struct lustre_handle child_lockh = {0};
         struct mdc_op_data opdata;
-        void *handle = NULL;
         int update_mode, rc = 0;
         ENTRY;
 
@@ -2665,7 +2789,7 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset,
                                          &de_srcdir,LCK_PW,MDS_INODELOCK_UPDATE,
                                          &update_mode, rec->ur_name, 
                                          rec->ur_namelen, &child_lockh, &de_old,
-                                         LCK_EX, MDS_INODELOCK_LOOKUP, NULL);
+                                         LCK_EX, MDS_INODELOCK_LOOKUP);
         LASSERT(rc == 0);
         LASSERT(de_srcdir);
         LASSERT(de_srcdir->d_inode);
@@ -2698,17 +2822,11 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset,
        
         if (rc)
                 GOTO(cleanup, rc);
-
-        handle = fsfilt_start(obd, de_srcdir->d_inode, FSFILT_OP_UNLINK, NULL);
-        if (IS_ERR(handle))
-                GOTO(cleanup, rc = PTR_ERR(handle));
-        rc = fsfilt_del_dir_entry(obd, de_old);
-        d_drop(de_old);
-
+        
+        rc = mds_del_local_dentry(rec, offset, req, NULL, de_srcdir, de_old);
 cleanup:
         EXIT;
-        rc = mds_finish_transno(mds, de_srcdir ? de_srcdir->d_inode : NULL,
-                                handle, req, rc, 0);
+
         if (req2)
                 ptlrpc_req_finished(req2);
 
@@ -2736,12 +2854,14 @@ static int mds_reint_rename(struct mds_update_record *rec, int offset,
         struct dentry *de_tgtdir = NULL;
         struct dentry *de_old = NULL;
         struct dentry *de_new = NULL;
+        struct inode *old_inode = NULL, *new_inode = NULL;
         struct mds_obd *mds = mds_req2mds(req);
         struct lustre_handle dlm_handles[7] = {{0},{0},{0},{0},{0},{0},{0}};
         struct mds_body *body = NULL;
         struct llog_create_locks *lcl = NULL;
-        int rc = 0, log_unlink = 0, lock_count = 3;
-        int cleanup_phase = 0;
+        struct lov_mds_md *lmm = NULL;
+        int rc = 0, cleanup_phase = 0;
+
         void *handle = NULL;
         ENTRY;
 
@@ -2783,21 +2903,60 @@ static int mds_reint_rename(struct mds_update_record *rec, int offset,
 
         cleanup_phase = 1; /* parent(s), children, locks */
 
-        if (de_new->d_inode)
-                lock_count = 4;
+        old_inode = de_old->d_inode;
+        new_inode = de_new->d_inode;
 
         /* sanity check for src inode */
-        if (de_old->d_inode->i_ino == de_srcdir->d_inode->i_ino ||
-            de_old->d_inode->i_ino == de_tgtdir->d_inode->i_ino)
-                GOTO(cleanup, rc = -EINVAL);
-        
+        if (de_old->d_flags & DCACHE_CROSS_REF) {
+                LASSERT(de_old->d_inode == NULL);
+                                                                                                                                                                                                     
+                /*
+                 * in the case of cross-ref dir, we can perform this check only
+                 * if child and parent lie on the same mds. This is because
+                 * otherwise they can have the same inodes.
+                 */
+                if (de_old->d_mdsnum == mds->mds_num) {
+                        if (de_old->d_inum == de_srcdir->d_inode->i_ino ||
+                            de_old->d_inum == de_tgtdir->d_inode->i_ino)
+                                GOTO(cleanup, rc = -EINVAL);
+                }
+        } else {
+                LASSERT(de_old->d_inode != NULL);
+                if (de_old->d_inode->i_ino == de_srcdir->d_inode->i_ino ||
+                    de_old->d_inode->i_ino == de_tgtdir->d_inode->i_ino)
+                        GOTO(cleanup, rc = -EINVAL);
+        }
+                                                                                                                                                                                                     
         /* sanity check for dest inode */
-        if (de_new->d_inode &&
-            (de_new->d_inode->i_ino == de_srcdir->d_inode->i_ino ||
-             de_new->d_inode->i_ino == de_tgtdir->d_inode->i_ino))
-                GOTO(cleanup, rc = -EINVAL);
-
-        if (de_old->d_inode == de_new->d_inode)
+        if (de_new->d_flags & DCACHE_CROSS_REF) {
+                LASSERT(new_inode == NULL);
+                                                                                                                                                                                                     
+                /* the same check about target dentry. */
+                if (de_new->d_mdsnum == mds->mds_num) {
+                        if (de_new->d_inum == de_srcdir->d_inode->i_ino ||
+                            de_new->d_inum == de_tgtdir->d_inode->i_ino)
+                                GOTO(cleanup, rc = -EINVAL);
+                }
+                                                                                                                                                                                                     
+                /*
+                 * regular files usualy do not have ->rename() implemented. But
+                 * we handle only this case when @de_new is cross-ref entry,
+                 * because in other cases it will be handled by vfs_rename().
+                 */
+                if (de_old->d_inode && (!de_old->d_inode->i_op || 
+                    !de_old->d_inode->i_op->rename))
+                        GOTO(cleanup, rc = -EPERM);
+        } else {
+                if (new_inode &&
+                    (new_inode->i_ino == de_srcdir->d_inode->i_ino ||
+                     new_inode->i_ino == de_tgtdir->d_inode->i_ino))
+                        GOTO(cleanup, rc = -EINVAL);
+        }
+        
+        /* check if inodes point to each other. */
+        if (!(de_old->d_flags & DCACHE_CROSS_REF) &&
+            !(de_new->d_flags & DCACHE_CROSS_REF) &&
+            old_inode == new_inode)
                 GOTO(cleanup, rc = 0);
 
         /* if we are about to remove the target at first, pass the EA of
@@ -2805,52 +2964,78 @@ static int mds_reint_rename(struct mds_update_record *rec, int offset,
         body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body));
         LASSERT(body != NULL);
 
-        if (de_new->d_inode &&
-            S_ISREG(de_new->d_inode->i_mode) &&
-            de_new->d_inode->i_nlink == 1 &&
-            mds_open_orphan_count(de_new->d_inode) == 0) {
-                mds_pack_inode2fid(obd, &body->fid1, de_new->d_inode);
-                mds_pack_inode2body(obd, body, de_new->d_inode);
-                mds_pack_md(obd, req->rq_repmsg, 1, body, de_new->d_inode, 1);
-                if (!(body->valid & OBD_MD_FLEASIZE)) {
-                        body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
-                        OBD_MD_FLATIME | OBD_MD_FLMTIME);
-                } else {
-                        log_unlink = 1; 
-                }
+        /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
+        if (new_inode) 
+                DOWN_READ_I_ALLOC_SEM(new_inode);
+        cleanup_phase = 2; /* up(&new_inode->i_sem) when finished */
+
+        if (new_inode && ((S_ISDIR(new_inode->i_mode) && 
+            new_inode->i_nlink == 2) ||
+            new_inode->i_nlink == 1)) {
+                if (mds_orphan_open_count(new_inode) > 0) {
+                        /* need to lock pending_dir before transaction */
+                        down(&mds->mds_pending_dir->d_inode->i_sem);
+                        cleanup_phase = 3; /* up(&pending_dir->i_sem) */
+                } else if (S_ISREG(new_inode->i_mode)) {
+                        mds_pack_inode2fid(obd, &body->fid1, new_inode);
+                        mds_pack_inode2body(obd, body, new_inode);
+                        mds_pack_md(obd, req->rq_repmsg, 1, body, new_inode, 
+                                    MDS_PACK_MD_LOCK);
+                 }
         }
 
         OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_RENAME_WRITE,
                        de_srcdir->d_inode->i_sb);
 
-        handle = fsfilt_start(obd, de_tgtdir->d_inode, FSFILT_OP_RENAME, NULL);
-        if (IS_ERR(handle))
-                GOTO(cleanup, rc = PTR_ERR(handle));
-
-        /* FIXME need adjust the journal block count? */
-        /* if the target should be moved to PENDING, we at first increase the
-         * link and later vfs_rename() will decrease the link count again */
-        if (de_new->d_inode &&
-            S_ISREG(de_new->d_inode->i_mode) &&
-            de_new->d_inode->i_nlink == 1 &&
-            mds_open_orphan_count(de_new->d_inode) > 0) {
-                rc = mds_add_link_orphan(rec, obd, de_new);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+        /* Check if we are moving old entry into its child. 2.6 does not
+           check for this in vfs_rename() anymore */
+        if (is_subdir(de_new, de_old))
+                GOTO(cleanup, rc = -EINVAL);
+#endif
+        if (de_old->d_flags & DCACHE_CROSS_REF) {
+                rc = mds_add_local_dentry(rec, offset, req, de_old, de_tgtdir, 
+                                          de_new);
                 if (rc)
                         GOTO(cleanup, rc);
+                                                                                                                                                                                                     
+                rc = mds_del_local_dentry(rec, offset, req, de_old, de_srcdir, 
+                                          de_old);
+                GOTO(cleanup, rc);
         }
 
+        lmm = lustre_msg_buf(req->rq_repmsg, 1, 0);
+        handle = fsfilt_start_log(obd, de_tgtdir->d_inode, FSFILT_OP_RENAME,
+                                  NULL, le32_to_cpu(lmm->lmm_stripe_count));
+
+        if (IS_ERR(handle))
+                GOTO(cleanup, rc = PTR_ERR(handle));
+
         lock_kernel();
         de_old->d_fsdata = req;
         de_new->d_fsdata = req;
         rc = vfs_rename(de_srcdir->d_inode, de_old, de_tgtdir->d_inode, de_new);
         unlock_kernel();
 
-        if (!rc && log_unlink) {
-                if (mds_log_op_unlink(obd, de_tgtdir->d_inode,
-                                lustre_msg_buf(req->rq_repmsg, 1, 0),
-                                req->rq_repmsg->buflens[1],
-                                lustre_msg_buf(req->rq_repmsg, 2, 0),
-                                req->rq_repmsg->buflens[2], &lcl) > 0) {
+        if (rc == 0 && new_inode != NULL && new_inode->i_nlink == 0) {
+                if (mds_orphan_open_count(new_inode) > 0)
+                        rc = mds_orphan_add_link(rec, obd, de_new);
+
+                if (rc == 1)
+                        GOTO(cleanup, rc = 0);
+
+                if (!S_ISREG(new_inode->i_mode))
+                        GOTO(cleanup, rc);
+
+                if (!(body->valid & OBD_MD_FLEASIZE)) {
+                        body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
+                                        OBD_MD_FLATIME | OBD_MD_FLMTIME);
+                } else if (mds_log_op_unlink(obd, new_inode,
+                                             lustre_msg_buf(req->rq_repmsg,1,0),
+                                             req->rq_repmsg->buflens[1],
+                                             lustre_msg_buf(req->rq_repmsg,2,0),
+                                             req->rq_repmsg->buflens[2], 
+                                             &lcl) > 0) {
                         body->valid |= OBD_MD_FLCOOKIE;
                 }
         }
@@ -2860,6 +3045,11 @@ cleanup:
         rc = mds_finish_transno(mds, de_tgtdir ? de_tgtdir->d_inode : NULL,
                                 handle, req, rc, 0);
         switch (cleanup_phase) {
+        case 3:
+                up(&mds->mds_pending_dir->d_inode->i_sem);
+        case 2:
+                if (new_inode)
+                        UP_READ_I_ALLOC_SEM(new_inode);
         case 1:
 #ifdef S_PDIROPS
                 if (dlm_handles[5].cookie != 0)
@@ -2871,13 +3061,13 @@ cleanup:
                         ptlrpc_save_llog_lock(req, lcl);
 
                 if (rc) {
-                        if (lock_count == 4)
+                        if (dlm_handles[3].cookie != 0)
                                 ldlm_lock_decref(&(dlm_handles[3]), LCK_EX);
                         ldlm_lock_decref(&(dlm_handles[2]), LCK_EX);
                         ldlm_lock_decref(&(dlm_handles[1]), LCK_PW);
                         ldlm_lock_decref(&(dlm_handles[0]), LCK_PW);
                 } else {
-                        if (lock_count == 4)
+                        if (dlm_handles[3].cookie != 0)
                                 ptlrpc_save_lock(req,&(dlm_handles[3]), LCK_EX);
                         ptlrpc_save_lock(req, &(dlm_handles[2]), LCK_EX);
                         ptlrpc_save_lock(req, &(dlm_handles[1]), LCK_PW);
diff --git a/lustre/mds/mds_unlink_open.c b/lustre/mds/mds_unlink_open.c
index e64bc5ec26..20191c6f08 100644
--- a/lustre/mds/mds_unlink_open.c
+++ b/lustre/mds/mds_unlink_open.c
@@ -40,75 +40,6 @@
 
 #include "mds_internal.h"
 
-
-/* If we are unlinking an open file/dir (i.e. creating an orphan) then
- * we instead link the inode into the PENDING directory until it is
- * finally released.  We can't simply call mds_reint_rename() or some
- * part thereof, because we don't have the inode to check for link
- * count/open status until after it is locked.
- *
- * For lock ordering, we always get the PENDING, then pending_child lock
- * last to avoid deadlocks.
- */
-
-int mds_open_unlink_rename(struct mds_update_record *rec,
-                           struct obd_device *obd, struct dentry *dparent,
-                           struct dentry *dchild, void **handle)
-{
-        struct mds_obd *mds = &obd->u.mds;
-        struct inode *pending_dir = mds->mds_pending_dir->d_inode;
-        struct dentry *pending_child;
-        char fidname[LL_FID_NAMELEN];
-        int fidlen = 0, rc;
-        unsigned mode;
-        ENTRY;
-
-        LASSERT(!mds_inode_is_orphan(dchild->d_inode));
-
-        down(&pending_dir->i_sem);
-        fidlen = ll_fid2str(fidname, dchild->d_inode->i_ino,
-                            dchild->d_inode->i_generation);
-
-        CDEBUG(D_HA, "pending destroy of %dx open file %s = %s\n",
-               mds_open_orphan_count(dchild->d_inode), rec->ur_name, fidname);
-
-        pending_child = lookup_one_len(fidname, mds->mds_pending_dir, fidlen);
-        if (IS_ERR(pending_child))
-                GOTO(out_lock, rc = PTR_ERR(pending_child));
-
-        if (pending_child->d_inode != NULL) {
-                CERROR("re-destroying orphan file %s?\n", rec->ur_name);
-                LASSERT(pending_child->d_inode == dchild->d_inode);
-                GOTO(out_dput, rc = 0);
-        }
-
-        /* link() is semanticaly-wrong for S_IFDIR, so we set S_IFREG
-         * for linking and return real mode back then -bzzz */
-        mode = dchild->d_inode->i_mode;
-        dchild->d_inode->i_mode = S_IFREG;
-        rc = vfs_link(dchild, pending_dir, pending_child);
-        if (rc)
-                CERROR("error linking orphan %s to PENDING: rc = %d\n",
-                       rec->ur_name, rc);
-        else
-                mds_inode_set_orphan(dchild->d_inode);
-
-        /* return mode and correct i_nlink if inode is directory */
-        LASSERT(dchild->d_inode->i_nlink == 1);
-        dchild->d_inode->i_mode = mode;
-        if ((mode & S_IFMT) == S_IFDIR) {
-                dchild->d_inode->i_nlink++;
-                pending_dir->i_nlink++;
-        }
-        mark_inode_dirty(dchild->d_inode);
-
-out_dput:
-        dput(pending_child);
-out_lock:
-        up(&pending_dir->i_sem);
-        RETURN(rc);
-}
-
 static int mds_osc_destroy_orphan(struct mds_obd *mds,
                                   struct inode *inode,
                                   struct lov_mds_md *lmm,
@@ -199,19 +130,6 @@ static int mds_unlink_orphan(struct obd_device *obd, struct dentry *dchild,
                 GOTO(out_free_lmm, rc);
         }
 
-        down(&inode->i_sem);
-        rc = fsfilt_get_md(obd, inode, lmm, mds->mds_max_mdsize);
-        up(&inode->i_sem);
-
-        if (rc < 0) {
-                CERROR("Error %d reading eadata for ino %lu\n",
-                       rc, inode->i_ino);
-                GOTO(out_free_lmm, rc);
-        } else if (rc > 0) {
-                lmm_size = rc;
-                rc = 0;
-        }
-
         if (S_ISDIR(inode->i_mode))
                 rc = vfs_rmdir(pending_dir, dchild);
         else
@@ -310,12 +228,14 @@ int mds_cleanup_orphans(struct obd_device *obd)
                 }
 
                 child_inode = dchild->d_inode;
+                DOWN_READ_I_ALLOC_SEM(child_inode);
                 if (mds_inode_is_orphan(child_inode) &&
-                    mds_open_orphan_count(child_inode)) {
-                        CWARN("orphan %s was re-opened during recovery\n", d_name);
+                    mds_orphan_open_count(child_inode)) {
+                        UP_READ_I_ALLOC_SEM(child_inode);
+                        CWARN("orphan %s re-opened during recovery\n", d_name);
                         GOTO(next, rc = 0);
                 }
-
+                UP_READ_I_ALLOC_SEM(child_inode);
                 rc = mds_unlink_orphan(obd, dchild, child_inode, pending_dir);
                 if (rc == 0) {
                         item ++;
diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c
index 7ca260f8bc..e87e1d5928 100644
--- a/lustre/obdclass/class_obd.c
+++ b/lustre/obdclass/class_obd.c
@@ -74,9 +74,9 @@
 atomic_t portal_kmemory = {0};
 #endif
 
-struct semaphore obd_conf_sem;   /* serialize configuration commands */
 struct obd_device obd_dev[MAX_OBD_DEVICES];
 struct list_head obd_types;
+spinlock_t obd_dev_lock;
 #ifndef __KERNEL__
 atomic_t obd_memory;
 int obd_memmax;
@@ -86,13 +86,22 @@ int proc_version;
 
 /* The following are visible and mutable through /proc/sys/lustre/. */
 unsigned int obd_fail_loc;
+unsigned int obd_dump_on_timeout;
 unsigned int obd_timeout = 100;
+unsigned int ldlm_timeout = 6;
 char obd_lustre_upcall[128] = "DEFAULT"; /* or NONE or /full/path/to/upcall  */
-unsigned int obd_sync_filter; /* = 0, don't sync by default */
+unsigned int obd_sync_filter = 1; /* = 1, sync by default */
 
 DECLARE_WAIT_QUEUE_HEAD(obd_race_waitq);
 
 #ifdef __KERNEL__
+
+unsigned int obd_print_fail_loc(void)
+{
+        CWARN("obd_fail_loc = %x\n", obd_fail_loc);
+        return obd_fail_loc;
+}
+
 /*  opening /dev/obd */
 static int obd_class_open(struct inode * inode, struct file * file)
 {
@@ -159,7 +168,7 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
         struct obd_ioctl_data *data;
         struct portals_debug_ioctl_data *debug_data;
         struct obd_device *obd = NULL;
-        int err = 0, len = 0, serialised = 0;
+        int err = 0, len = 0;
         ENTRY;
 
         if (current->fsuid != 0)
@@ -176,26 +185,6 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
                 return 0;
         }
 
-        switch (cmd) {
-        case OBD_IOC_BRW_WRITE:
-        case OBD_IOC_BRW_READ:
-        case OBD_IOC_GETATTR:
-        case ECHO_IOC_ENQUEUE:
-        case ECHO_IOC_CANCEL:
-        case OBD_IOC_CLIENT_RECOVER:
-        case OBD_IOC_CATLOGLIST:
-        case OBD_IOC_LLOG_INFO:
-        case OBD_IOC_LLOG_PRINT:
-        case OBD_IOC_LLOG_CANCEL:
-        case OBD_IOC_LLOG_CHECK:
-        case OBD_IOC_LLOG_REMOVE:
-                break;
-        default:
-                down(&obd_conf_sem);
-                serialised = 1;
-                break;
-        }
-
         CDEBUG(D_IOCTL, "cmd = %x, obd = %p\n", cmd, obd);
         if (obd_ioctl_getdata(&buf, &len, (void *)arg)) {
                 CERROR("OBD ioctl: data error\n");
@@ -344,8 +333,6 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
  out:
         if (buf)
                 obd_ioctl_freedata(buf, len);
-        if (serialised)
-                up(&obd_conf_sem);
         RETURN(err);
 } /* class_handle_ioctl */
 
@@ -381,7 +368,10 @@ void *obd_psdev = NULL;
 EXPORT_SYMBOL(obd_dev);
 EXPORT_SYMBOL(obdo_cachep);
 EXPORT_SYMBOL(obd_fail_loc);
+EXPORT_SYMBOL(obd_print_fail_loc);
 EXPORT_SYMBOL(obd_race_waitq);
+EXPORT_SYMBOL(obd_dump_on_timeout);
+EXPORT_SYMBOL(ldlm_timeout);
 EXPORT_SYMBOL(obd_timeout);
 EXPORT_SYMBOL(obd_lustre_upcall);
 EXPORT_SYMBOL(obd_sync_filter);
@@ -414,6 +404,7 @@ EXPORT_SYMBOL(class_exp2cliimp);
 EXPORT_SYMBOL(class_conn2cliimp);
 EXPORT_SYMBOL(class_disconnect);
 EXPORT_SYMBOL(class_disconnect_exports);
+EXPORT_SYMBOL(class_disconnect_stale_exports);
 
 EXPORT_SYMBOL(oig_init);
 EXPORT_SYMBOL(oig_release);
@@ -571,7 +562,7 @@ int init_obdclass(void)
         if (err)
                 return err;
 
-        sema_init(&obd_conf_sem, 1);
+        spin_lock_init(&obd_dev_lock);
         INIT_LIST_HEAD(&obd_types);
 
         err = misc_register(&obd_psdev);
diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c
index 3bac4a35ce..e464b58285 100644
--- a/lustre/obdclass/genops.c
+++ b/lustre/obdclass/genops.c
@@ -187,23 +187,36 @@ int class_unregister_type(char *name)
         RETURN(0);
 } /* class_unregister_type */
 
-struct obd_device *class_newdev(int *dev)
+struct obd_device *class_newdev(struct obd_type *type)
 {
         struct obd_device *result = NULL;
         int i;
 
-        for (i = 0 ; i < MAX_OBD_DEVICES ; i++) {
+        spin_lock(&obd_dev_lock);
+        for (i = 0 ; i < MAX_OBD_DEVICES && result == NULL; i++) {
                 struct obd_device *obd = &obd_dev[i];
                 if (!obd->obd_type) {
+                        LASSERT(obd->obd_minor == i);
+                        memset(obd, 0, sizeof(*obd));
+                        obd->obd_minor = i;
+                        obd->obd_type = type;
                         result = obd;
-                        if (dev)
-                                *dev = i;
-                        break;
                 }
         }
+        spin_unlock(&obd_dev_lock);
         return result;
 }
 
+void class_release_dev(struct obd_device *obd)
+{
+        int minor = obd->obd_minor;
+
+        spin_lock(&obd_dev_lock);
+        memset(obd, 0, sizeof(*obd));
+        obd->obd_minor = minor;
+        spin_unlock(&obd_dev_lock);
+}
+
 int class_name2dev(char *name)
 {
         int i;
@@ -211,12 +224,15 @@ int class_name2dev(char *name)
         if (!name)
                 return -1;
 
+        spin_lock(&obd_dev_lock);
         for (i = 0; i < MAX_OBD_DEVICES; i++) {
                 struct obd_device *obd = &obd_dev[i];
-                if (obd->obd_name && strcmp(name, obd->obd_name) == 0)
+                if (obd->obd_name && strcmp(name, obd->obd_name) == 0) {
+                        spin_unlock(&obd_dev_lock);
                         return i;
+                }
         }
-
+        spin_unlock(&obd_dev_lock);
         return -1;
 }
 
@@ -231,13 +247,15 @@ struct obd_device *class_name2obd(char *name)
 int class_uuid2dev(struct obd_uuid *uuid)
 {
         int i;
-
+        spin_lock(&obd_dev_lock);
         for (i = 0; i < MAX_OBD_DEVICES; i++) {
                 struct obd_device *obd = &obd_dev[i];
-                if (obd_uuid_equals(uuid, &obd->obd_uuid))
+                if (obd_uuid_equals(uuid, &obd->obd_uuid)) {
+                        spin_unlock(&obd_dev_lock);
                         return i;
+                }
         }
-
+        spin_unlock(&obd_dev_lock);
         return -1;
 }
 
@@ -259,6 +277,7 @@ struct obd_device * class_find_client_obd(struct obd_uuid *tgt_uuid,
 {
         int i;
 
+        spin_lock(&obd_dev_lock);
         for (i = 0; i < MAX_OBD_DEVICES; i++) {
                 struct obd_device *obd = &obd_dev[i];
                 if (obd->obd_type == NULL)
@@ -276,11 +295,12 @@ struct obd_device * class_find_client_obd(struct obd_uuid *tgt_uuid,
                         if (obd_uuid_equals(tgt_uuid, &imp->imp_target_uuid) &&
                             ((grp_uuid)? obd_uuid_equals(grp_uuid,
                                                          &obd->obd_uuid) : 1)) {
+                                spin_unlock(&obd_dev_lock);
                                 return obd;
                         }
                 }
         }
-
+        spin_unlock(&obd_dev_lock);
         return NULL;
 }
 
@@ -291,13 +311,14 @@ struct obd_device * class_find_client_obd(struct obd_uuid *tgt_uuid,
 struct obd_device * class_devices_in_group(struct obd_uuid *grp_uuid, int *next)
 {
         int i;
+
         if (next == NULL) 
                 i = 0;
         else if (*next >= 0 && *next < MAX_OBD_DEVICES)
                 i = *next;
         else 
                 return NULL;
-                
+        spin_lock(&obd_dev_lock);                
         for (; i < MAX_OBD_DEVICES; i++) {
                 struct obd_device *obd = &obd_dev[i];
                 if (obd->obd_type == NULL)
@@ -305,28 +326,27 @@ struct obd_device * class_devices_in_group(struct obd_uuid *grp_uuid, int *next)
                 if (obd_uuid_equals(grp_uuid, &obd->obd_uuid)) {
                         if (next != NULL)
                                 *next = i+1;
+                        spin_unlock(&obd_dev_lock);
                         return obd;
                 }
         }
 
+        spin_unlock(&obd_dev_lock);
         return NULL;
 }
 
 
 void obd_cleanup_caches(void)
 {
-        int rc;
         ENTRY;
         if (obdo_cachep) {
-                rc = kmem_cache_destroy(obdo_cachep);
-                if (rc)
-                        CERROR("Cannot destory ll_obdo_cache\n");
+                LASSERTF(kmem_cache_destroy(obdo_cachep) == 0,
+                         "Cannot destory ll_obdo_cache\n");
                 obdo_cachep = NULL;
         }
         if (import_cachep) {
-                rc = kmem_cache_destroy(import_cachep);
-                if (rc)
-                        CERROR("Cannot destory ll_import_cache\n");
+                LASSERTF(kmem_cache_destroy(import_cachep) == 0,
+                         "Cannot destory ll_import_cache\n");
                 import_cachep = NULL;
         }
         EXIT;
@@ -526,6 +546,16 @@ void class_import_put(struct obd_import *import)
 
         ptlrpc_put_connection_superhack(import->imp_connection);
 
+        while (!list_empty(&import->imp_conn_list)) {
+                struct obd_import_conn *imp_conn;
+
+                imp_conn = list_entry(import->imp_conn_list.next,
+                                      struct obd_import_conn, oic_item);
+                list_del(&imp_conn->oic_item);
+                ptlrpc_put_connection_superhack(imp_conn->oic_conn);
+                OBD_FREE(imp_conn, sizeof(*imp_conn));
+        }
+
         LASSERT(list_empty(&import->imp_handle.h_link));
         OBD_FREE(import, sizeof(*import));
         EXIT;
@@ -552,6 +582,7 @@ struct obd_import *class_new_import(void)
         atomic_set(&imp->imp_refcount, 2);
         atomic_set(&imp->imp_inflight, 0);
         atomic_set(&imp->imp_replay_inflight, 0);
+        INIT_LIST_HEAD(&imp->imp_conn_list);
         INIT_LIST_HEAD(&imp->imp_handle.h_link);
         class_handle_hash(&imp->imp_handle, import_handle_addref);
 
@@ -634,24 +665,18 @@ int class_disconnect(struct obd_export *export, int flags)
         RETURN(0);
 }
 
-void class_disconnect_exports(struct obd_device *obd, int flags)
+static void  class_disconnect_export_list(struct list_head *list, int flags)
 {
         int rc;
-        struct list_head *tmp, *n, work_list;
         struct lustre_handle fake_conn;
         struct obd_export *fake_exp, *exp;
         ENTRY;
 
         /* Move all of the exports from obd_exports to a work list, en masse. */
-        spin_lock(&obd->obd_dev_lock);
-        list_add(&work_list, &obd->obd_exports);
-        list_del_init(&obd->obd_exports);
-        spin_unlock(&obd->obd_dev_lock);
-
-        CDEBUG(D_HA, "OBD device %d (%p) has exports, "
-               "disconnecting them\n", obd->obd_minor, obd);
-        list_for_each_safe(tmp, n, &work_list) {
-                exp = list_entry(tmp, struct obd_export, exp_obd_chain);
+        /* It's possible that an export may disconnect itself, but
+         * nothing else will be added to this list. */
+        while(!list_empty(list)) {
+                exp = list_entry(list->next, struct obd_export, exp_obd_chain);
                 class_export_get(exp);
 
                 if (obd_uuid_equals(&exp->exp_client_uuid,
@@ -684,6 +709,53 @@ void class_disconnect_exports(struct obd_device *obd, int flags)
         EXIT;
 }
 
+void class_disconnect_exports(struct obd_device *obd, int flags)
+{
+        struct list_head work_list;
+        ENTRY;
+
+        /* Move all of the exports from obd_exports to a work list, en masse. */
+        spin_lock(&obd->obd_dev_lock);
+        list_add(&work_list, &obd->obd_exports);
+        list_del_init(&obd->obd_exports);
+        spin_unlock(&obd->obd_dev_lock);
+
+        CDEBUG(D_HA, "OBD device %d (%p) has exports, "
+               "disconnecting them\n", obd->obd_minor, obd);
+        class_disconnect_export_list(&work_list, flags);
+        EXIT;
+}
+
+/* Remove exports that have not completed recovery.
+ */
+void class_disconnect_stale_exports(struct obd_device *obd, int flags)
+{
+        struct list_head work_list;
+        struct list_head *pos, *n;
+        struct obd_export *exp;
+        int cnt = 0;
+        ENTRY;
+
+        INIT_LIST_HEAD(&work_list);
+        spin_lock(&obd->obd_dev_lock);
+        list_for_each_safe(pos, n, &obd->obd_exports) {
+                exp = list_entry(pos, struct obd_export, exp_obd_chain);
+                if (exp->exp_replay_needed) {
+                        list_del(&exp->exp_obd_chain);
+                        list_add(&exp->exp_obd_chain, &work_list);
+                        cnt++;
+                }
+        }
+        spin_unlock(&obd->obd_dev_lock);
+
+        CDEBUG(D_ERROR, "%s: disconnecting %d stale clients\n",
+               obd->obd_name, cnt);
+        class_disconnect_export_list(&work_list, flags);
+        EXIT;
+}
+
+
+
 int oig_init(struct obd_io_group **oig_out)
 {
         struct obd_io_group *oig;
@@ -714,8 +786,7 @@ void oig_release(struct obd_io_group *oig)
                 OBD_FREE(oig, sizeof(*oig));
 }
 
-void oig_add_one(struct obd_io_group *oig,
-                  struct oig_callback_context *occ)
+void oig_add_one(struct obd_io_group *oig, struct oig_callback_context *occ)
 {
         unsigned long flags;
         CDEBUG(D_CACHE, "oig %p ready to roll\n", oig);
@@ -770,15 +841,24 @@ static int oig_done(struct obd_io_group *oig)
 static void interrupted_oig(void *data)
 {
         struct obd_io_group *oig = data;
-        struct list_head *pos;
         struct oig_callback_context *occ;
         unsigned long flags;
 
         spin_lock_irqsave(&oig->oig_lock, flags);
-        list_for_each(pos, &oig->oig_occ_list) {
-                occ = list_entry(pos, struct oig_callback_context,
-                                 occ_oig_item);
+        /* We need to restart the processing each time we drop the lock, as
+         * it is possible other threads called oig_complete_one() to remove
+         * an entry elsewhere in the list while we dropped lock.  We need to
+         * drop the lock because osc_ap_completion() calls oig_complete_one()
+         * which re-gets this lock ;-) as well as a lock ordering issue. */
+restart:
+        list_for_each_entry(occ, &oig->oig_occ_list, occ_oig_item) {
+                if (occ->interrupted)
+                        continue;
+                occ->interrupted = 1;
+                spin_unlock_irqrestore(&oig->oig_lock, flags);
                 occ->occ_interrupted(occ);
+                spin_lock_irqsave(&oig->oig_lock, flags);
+                goto restart;
         }
         spin_unlock_irqrestore(&oig->oig_lock, flags);
 }
diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c
index 6e3d512de1..7c94552fec 100644
--- a/lustre/obdclass/llog_obd.c
+++ b/lustre/obdclass/llog_obd.c
@@ -175,7 +175,7 @@ int llog_obd_origin_setup(struct obd_device *obd, struct obd_llogs *llogs,
 EXPORT_SYMBOL(llog_obd_origin_setup);
 
 int obd_llog_cat_initialize(struct obd_device *obd, struct obd_llogs *llogs, 
-                            int count, char *name)
+                            int count, const char *name)
 {
         struct llog_catid *idarray;
         int size = sizeof(*idarray) * count;
diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c
index 810e904b52..d685687775 100644
--- a/lustre/obdclass/lprocfs_status.c
+++ b/lustre/obdclass/lprocfs_status.c
@@ -35,6 +35,7 @@
 #  include <asm/statfs.h>
 # endif
 # include <linux/seq_file.h>
+# include <asm/div64.h>
 #else /* __KERNEL__ */
 # include <liblustre.h>
 #endif
@@ -613,6 +614,8 @@ int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned num_private_stats)
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, cleanup);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, process_config);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, postrecov);
+        LPROCFS_OBD_OP_INIT(num_private_stats, stats, add_conn);
+        LPROCFS_OBD_OP_INIT(num_private_stats, stats, del_conn);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, connect_post);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, disconnect);
@@ -793,6 +796,119 @@ void lprocfs_oh_clear(struct obd_histogram *oh)
 }
 EXPORT_SYMBOL(lprocfs_oh_clear);
 
+/* XXX copied from ldlm/ldlm_lockd.c, copied from ptlrpc/service.c */
+static long timeval_sub(struct timeval *large, struct timeval *small)
+{
+        return ((large->tv_sec - small->tv_sec) * 1000000) +
+                (large->tv_usec - small->tv_usec);
+}
+void lprocfs_stime_record(struct obd_service_time *stime, struct timeval *large,
+                          struct timeval *small)
+{
+        long diff = timeval_sub(large, small);
+
+        if (diff < 0)
+                return;
+
+        stime->st_num++;
+        stime->st_total_us += diff;
+}
+EXPORT_SYMBOL(lprocfs_stime_record);
+
+unsigned long lprocfs_stime_avg_ms(struct obd_service_time *stime)
+{
+        struct obd_service_time copy;
+
+        memcpy(&copy, stime, sizeof(copy));
+        if (copy.st_num > 0) {
+                do_div(copy.st_total_us, copy.st_num * 1000);
+                return (unsigned long)copy.st_total_us;
+        }
+        return 0;
+}
+EXPORT_SYMBOL(lprocfs_stime_avg_ms);
+
+unsigned long lprocfs_stime_avg_us(struct obd_service_time *stime)
+{
+        struct obd_service_time copy;
+        __u32 remainder;
+
+        memcpy(&copy, stime, sizeof(copy));
+        if (copy.st_num > 0) {
+                do_div(copy.st_total_us, copy.st_num);
+                remainder = do_div(copy.st_total_us, 1000);
+                return (unsigned long)remainder;
+        }
+        return 0;
+}
+EXPORT_SYMBOL(lprocfs_stime_avg_us);
+
+int lprocfs_obd_rd_recovery_status(char *page, char **start, off_t off,
+                                          int count, int *eof, void *data)
+{
+        struct obd_device *obd = data;
+        int len = 0, n,
+                connected = obd->obd_connected_clients,
+                max_recoverable = obd->obd_max_recoverable_clients,
+                recoverable = obd->obd_recoverable_clients,
+                completed = max_recoverable - recoverable,
+                queue_len = obd->obd_requests_queued_for_recovery,
+                replayed = obd->obd_replayed_requests;
+        __u64 next_transno = obd->obd_next_recovery_transno;
+
+        LASSERT(obd != NULL);
+        *eof = 1;
+
+        n = snprintf(page, count, "status: ");
+        page += n; len += n; count -= n;
+        if (obd->obd_max_recoverable_clients == 0) {
+                n = snprintf(page, count, "INACTIVE\n");
+                return len + n;
+        }
+
+        /* sampled unlocked, but really... */
+        if (obd->obd_recovering == 0) {
+                n = snprintf(page, count, "COMPLETE\n");
+                page += n; len += n; count -= n;
+
+                n = snprintf(page, count, "recovery_start: %lu\n",
+                             obd->obd_recovery_start);
+                page += n; len += n; count -= n;
+                n = snprintf(page, count, "recovery_end: %lu\n",
+                             obd->obd_recovery_end);
+                page += n; len += n; count -= n;
+                n = snprintf(page, count, "recovered_clients: %d\n",
+                             completed);
+                page += n; len += n; count -= n;
+                n = snprintf(page, count, "unrecovered_clients: %d\n",
+                             obd->obd_recoverable_clients);
+                page += n; len += n; count -= n;
+                n = snprintf(page, count, "last_transno: "LPD64"\n",
+                             next_transno - 1);
+                page += n; len += n; count -= n;
+                n = snprintf(page, count, "replayed_requests: %d\n", replayed);
+                return len + n;
+        }
+
+        n = snprintf(page, count, "RECOVERING\n");
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "recovery_start: %lu\n",
+                     obd->obd_recovery_start);
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "connected_clients: %d/%d\n",
+                     connected, max_recoverable);
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "completed_clients: %d/%d\n",
+                     completed, max_recoverable);
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "replayed_requests: %d/??\n", replayed);
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "queued_requests: %d\n", queue_len);
+        page += n; len += n; count -= n;
+        n = snprintf(page, count, "next_transno: "LPD64"\n", next_transno);
+        return len + n;
+}
+EXPORT_SYMBOL(lprocfs_obd_rd_recovery_status);
 #endif /* LPROCFS*/
 
 EXPORT_SYMBOL(lprocfs_register);
diff --git a/lustre/obdclass/obd_config.c b/lustre/obdclass/obd_config.c
index d686ab336e..325c2c1ecd 100644
--- a/lustre/obdclass/obd_config.c
+++ b/lustre/obdclass/obd_config.c
@@ -48,7 +48,7 @@ static int class_attach(struct lustre_cfg *lcfg)
         struct obd_type *type;
         struct obd_device *obd;
         char *typename, *name, *uuid;
-        int minor, rc, len, dev, stage = 0;
+        int rc, len, cleanup_phase = 0;
 
         if (!lcfg->lcfg_inllen1 || !lcfg->lcfg_inlbuf1) {
                 CERROR("No type passed!\n");
@@ -90,7 +90,7 @@ static int class_attach(struct lustre_cfg *lcfg)
                 CERROR("OBD: unknown type: %s\n", typename);
                 RETURN(-EINVAL);
         }
-        stage = 1;
+        cleanup_phase = 1;  /* class_put_type */
 
         obd = class_name2obd(name);
         if (obd != NULL) {
@@ -98,27 +98,12 @@ static int class_attach(struct lustre_cfg *lcfg)
                 GOTO(out, rc = -EEXIST);
         }
 
-        obd = class_newdev(&dev);
+        obd = class_newdev(type);
         if (obd == NULL)
                 GOTO(out, rc = -EINVAL);
 
-        /* have we attached a type to this device */
-        if (obd->obd_attached) {
-                CERROR("OBD: Device %d already attached.\n", obd->obd_minor);
-                GOTO(out, rc = -EBUSY);
-        }
-        if (obd->obd_type != NULL) {
-                CERROR("OBD: Device %d already typed as %s.\n",
-                       obd->obd_minor, MKSTR(obd->obd_type->typ_name));
-                GOTO(out, rc = -EBUSY);
-        }
-
-        LASSERT(obd == (obd_dev + obd->obd_minor));
-
-        minor = obd->obd_minor;
-        memset(obd, 0, sizeof(*obd));
-        obd->obd_minor = minor;
-        obd->obd_type = type;
+        cleanup_phase = 2;  /* class_release_dev */
+        
         INIT_LIST_HEAD(&obd->obd_exports);
         obd->obd_num_exports = 0;
         spin_lock_init(&obd->obd_dev_lock);
@@ -142,7 +127,8 @@ static int class_attach(struct lustre_cfg *lcfg)
         if (!obd->obd_name)
                 GOTO(out, rc = -ENOMEM);
         memcpy(obd->obd_name, name, len);
-        stage = 2;
+        
+        cleanup_phase = 3; /* free obd_name */
 
         len = strlen(uuid);
         if (len >= sizeof(obd->obd_uuid)) {
@@ -165,9 +151,11 @@ static int class_attach(struct lustre_cfg *lcfg)
                obd->obd_minor, typename);
         RETURN(0);
  out:
-        switch (stage) {
-        case 2:
+        switch (cleanup_phase) {
+        case 3:
                 OBD_FREE(obd->obd_name, strlen(obd->obd_name) + 1);
+        case 2:
+                class_release_dev(obd);
         case 1:
                 class_put_type(type);
                 obd->obd_type = NULL;
@@ -223,7 +211,6 @@ err_exp:
 
 static int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg)
 {
-        int minor;
         int err = 0;
 
         ENTRY;
@@ -248,10 +235,7 @@ static int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg)
         obd->obd_attached = 0;
         obd->obd_type->typ_refcnt--;
         class_put_type(obd->obd_type);
-        obd->obd_type = NULL;
-        minor = obd->obd_minor;
-        memset(obd, 0, sizeof(*obd));
-        obd->obd_minor = minor;
+        class_release_dev(obd);
         RETURN(err);
 }
 
@@ -369,7 +353,70 @@ out:
         }
 
         RETURN(err);
+}
+
+int class_add_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+        struct obd_import *imp;
+        struct obd_uuid uuid;
+        int priority, rc;
+        ENTRY;
+
+        if (lcfg->lcfg_inllen1 <= 0 ||
+            lcfg->lcfg_inllen1 > sizeof(struct obd_uuid)) {
+                CERROR("invalid conn_uuid\n");
+                RETURN(-EINVAL);
+        }
+        if (lcfg->lcfg_inllen2 != sizeof(int)) {
+                CERROR("invalid priority\n");
+                RETURN(-EINVAL);
+        }
+        if (strcmp(obd->obd_type->typ_name, "mdc") &&
+            strcmp(obd->obd_type->typ_name, "osc")) {
+                CERROR("can't add connection on non-client dev\n");
+                RETURN(-EINVAL);
+        }
+
+        imp = obd->u.cli.cl_import;
+        if (!imp) {
+                CERROR("try to add conn on immature client dev\n");
+                RETURN(-EINVAL);
+        }
 
+        obd_str2uuid(&uuid, lcfg->lcfg_inlbuf1);
+        priority = *((int*) lcfg->lcfg_inlbuf2);
+        rc = obd_add_conn(imp, &uuid, priority);
+
+        RETURN(rc);
+}
+int class_del_conn(struct obd_device *obd, struct lustre_cfg *lcfg)
+{
+        struct obd_import *imp;
+        struct obd_uuid uuid;
+        int rc;
+        ENTRY;
+
+        if (lcfg->lcfg_inllen1 <= 0 ||
+            lcfg->lcfg_inllen1 > sizeof(struct obd_uuid)) {
+                CERROR("invalid conn_uuid\n");
+                RETURN(-EINVAL);
+        }
+        if (strcmp(obd->obd_type->typ_name, "mdc") &&
+            strcmp(obd->obd_type->typ_name, "osc")) {
+                CERROR("can't add connection on non-client dev\n");
+                RETURN(-EINVAL);
+        }
+
+        imp = obd->u.cli.cl_import;
+        if (!imp) {
+                CERROR("try to del conn on immature client dev\n");
+                RETURN(-EINVAL);
+        }
+
+        obd_str2uuid(&uuid, lcfg->lcfg_inlbuf1);
+        rc = obd_del_conn(imp, &uuid);
+
+        RETURN(rc);
 }
 
 LIST_HEAD(lustre_profile_list);
@@ -533,6 +580,14 @@ int class_process_config(struct lustre_cfg *lcfg)
                 err = class_cleanup(obd, lcfg);
                 GOTO(out, err = 0);
         }
+        case LCFG_ADD_CONN: {
+                err = class_add_conn(obd, lcfg);
+                GOTO(out, err = 0);
+        }
+        case LCFG_DEL_CONN: {
+                err = class_del_conn(obd, lcfg);
+                GOTO(out, err = 0);
+        }
         default: {
                 err = obd_process_config(obd, sizeof(*lcfg), lcfg);
                 GOTO(out, err);
diff --git a/lustre/obdclass/sysctl.c b/lustre/obdclass/sysctl.c
index 158a2deaf6..b7fa894e09 100644
--- a/lustre/obdclass/sysctl.c
+++ b/lustre/obdclass/sysctl.c
@@ -50,9 +50,11 @@ struct ctl_table_header *obd_table_header = NULL;
 enum {
         OBD_FAIL_LOC = 1,       /* control test failures instrumentation */
         OBD_TIMEOUT,            /* RPC timeout before recovery/intr */
+        OBD_DUMP_ON_TIMEOUT,    /* dump kernel debug log upon eviction */
         OBD_UPCALL,             /* path to recovery upcall */
         OBD_MEMUSED,            /* bytes currently OBD_ALLOCated */
         OBD_SYNCFILTER,         /* XXX temporary, as we play with sync osts.. */
+        OBD_LDLM_TIMEOUT,       /* LDLM timeout for ASTs before client eviction */
 };
 
 int proc_fail_loc(ctl_table *table, int write, struct file *filp,
@@ -63,6 +65,8 @@ static ctl_table obd_table[] = {
                 &proc_dointvec},
         {OBD_TIMEOUT, "timeout", &obd_timeout, sizeof(int), 0644, NULL,
                 &proc_fail_loc},
+        {OBD_DUMP_ON_TIMEOUT, "dump_on_timeout", &obd_dump_on_timeout,
+                sizeof(int), 0644, NULL, &proc_dointvec},
         /* XXX need to lock so we avoid update races with recovery upcall! */
         {OBD_UPCALL, "upcall", obd_lustre_upcall, 128, 0644, NULL,
                 &proc_dostring, &sysctl_string },
@@ -70,6 +74,8 @@ static ctl_table obd_table[] = {
                 sizeof(int), 0644, NULL, &proc_dointvec},
         {OBD_SYNCFILTER, "filter_sync_on_commit", &obd_sync_filter, sizeof(int),
                 0644, NULL, &proc_dointvec},
+        {OBD_LDLM_TIMEOUT, "ldlm_timeout", &ldlm_timeout, sizeof(int), 0644,
+                NULL, &proc_dointvec},
         { 0 }
 };
 
diff --git a/lustre/obdecho/echo.c b/lustre/obdecho/echo.c
index 896270fc2f..e5e9ce8f91 100644
--- a/lustre/obdecho/echo.c
+++ b/lustre/obdecho/echo.c
@@ -74,6 +74,19 @@ static int echo_disconnect(struct obd_export *exp, int flags)
 
         spin_lock_irqsave(&exp->exp_lock, irqflags);
         exp->exp_flags = flags;
+        /* complete all outstanding replies */
+        spin_lock_irqsave(&exp->exp_lock, irqflags);
+        while (!list_empty(&exp->exp_outstanding_replies)) {
+                struct ptlrpc_reply_state *rs =
+                        list_entry(exp->exp_outstanding_replies.next,
+                                   struct ptlrpc_reply_state, rs_exp_list);
+                struct ptlrpc_service *svc = rs->rs_srv_ni->sni_service;
+
+                spin_lock(&svc->srv_lock);
+                list_del_init(&rs->rs_exp_list);
+                ptlrpc_schedule_difficult_reply(rs);
+                spin_unlock(&svc->srv_lock);
+        }
         spin_unlock_irqrestore(&exp->exp_lock, irqflags);
 
         return class_disconnect(exp, flags);
@@ -122,7 +135,6 @@ int echo_create(struct obd_export *exp, struct obdo *oa,
 
         oa->o_id = echo_next_id(obd);
         oa->o_valid = OBD_MD_FLID;
-        atomic_inc(&obd->u.echo.eo_create);
 
         return 0;
 }
@@ -148,7 +160,6 @@ int echo_destroy(struct obd_export *exp, struct obdo *oa,
                 RETURN(-EINVAL);
         }
 
-        atomic_inc(&obd->u.echo.eo_destroy);
 
         return 0;
 }
@@ -170,7 +181,7 @@ static int echo_getattr(struct obd_export *exp, struct obdo *oa,
                 RETURN(-EINVAL);
         }
 
-        obdo_cpy_md(oa, &obd->u.echo.oa, oa->o_valid);
+        obdo_cpy_md(oa, &obd->u.echo.eo_oa, oa->o_valid);
         oa->o_id = id;
 
         return 0;
@@ -192,10 +203,14 @@ static int echo_setattr(struct obd_export *exp, struct obdo *oa,
                 RETURN(-EINVAL);
         }
 
-        memcpy(&obd->u.echo.oa, oa, sizeof(*oa));
-
-        atomic_inc(&obd->u.echo.eo_setattr);
+        memcpy(&obd->u.echo.eo_oa, oa, sizeof(*oa));
 
+        if (oa->o_id & 4) {
+                /* Save lock to force ACKed reply */
+                ldlm_lock_addref (&obd->u.echo.eo_nl_lock, LCK_NL);
+                oti->oti_ack_locks[0].mode = LCK_NL;
+                oti->oti_ack_locks[0].lock = obd->u.echo.eo_nl_lock;
+        }
         return 0;
 }
 
@@ -288,6 +303,9 @@ int echo_preprw(int cmd, struct obd_export *export, struct obdo *oa,
         for (i = 0; i < objcount; i++, obj++) {
                 int gfp_mask = (obj->ioo_id & 1) ? GFP_HIGHUSER : GFP_KERNEL;
                 int ispersistent = obj->ioo_id == ECHO_PERSISTENT_OBJID;
+                int debug_setup = (!ispersistent &&
+                                   (oa->o_valid & OBD_MD_FLFLAGS) != 0 &&
+                                   (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0);
                 int j;
 
                 for (j = 0 ; j < obj->ioo_bufcnt ; j++, nb++, r++) {
@@ -322,7 +340,7 @@ int echo_preprw(int cmd, struct obd_export *export, struct obdo *oa,
                         if (cmd & OBD_BRW_READ)
                                 r->rc = r->len;
 
-                        if (!ispersistent)
+                        if (debug_setup)
                                 echo_page_debug_setup(r->page, cmd, obj->ioo_id,
                                                       r->offset, r->len);
                 }
@@ -391,7 +409,10 @@ int echo_commitrw(int cmd, struct obd_export *export, struct obdo *oa,
 
         for (i = 0; i < objcount; i++, obj++) {
                 int verify = (rc == 0 &&
-                              obj->ioo_id != ECHO_PERSISTENT_OBJID);
+                              obj->ioo_id != ECHO_PERSISTENT_OBJID &&
+                              (oa->o_valid & OBD_MD_FLFLAGS) != 0 &&
+                              (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0);
+ 
                 int j;
 
                 for (j = 0 ; j < obj->ioo_bufcnt ; j++, r++) {
@@ -442,6 +463,10 @@ commitrw_cleanup:
 
 static int echo_setup(struct obd_device *obd, obd_count len, void *buf)
 {
+        int                        rc;
+        int                        lock_flags = 0;
+        struct ldlm_res_id         res_id = {.name = {1}};
+
         ENTRY;
 
         spin_lock_init(&obd->u.echo.eo_lock);
@@ -453,6 +478,13 @@ static int echo_setup(struct obd_device *obd, obd_count len, void *buf)
                 LBUG();
                 RETURN(-ENOMEM);
         }
+        rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace, res_id,
+                              LDLM_PLAIN, NULL, LCK_NL, &lock_flags,
+                              NULL, ldlm_completion_ast, NULL, NULL,
+                              NULL, 0, NULL, &obd->u.echo.eo_nl_lock);
+        LASSERT (rc == ELDLM_OK);
+
+
 
         ptlrpc_init_client (LDLM_CB_REQUEST_PORTAL, LDLM_CB_REPLY_PORTAL,
                             "echo_ldlm_cb_client", &obd->obd_ldlm_client);
@@ -464,6 +496,13 @@ static int echo_cleanup(struct obd_device *obd, int flags)
         int leaked;
         ENTRY;
 
+        ldlm_lock_decref (&obd->u.echo.eo_nl_lock, LCK_NL);
+
+        /* XXX Bug 3413; wait for a bit to ensure the BL callback has
+         * happened before calling ldlm_namespace_free() */
+        set_current_state (TASK_UNINTERRUPTIBLE);
+        schedule_timeout (HZ);
+
         ldlm_namespace_free(obd->obd_namespace, flags & OBD_OPT_FORCE);
 
         leaked = atomic_read(&obd->u.echo.eo_prep);
diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c
index e4ffd4e065..e14484ff8d 100644
--- a/lustre/obdecho/echo_client.c
+++ b/lustre/obdecho/echo_client.c
@@ -479,8 +479,10 @@ echo_client_page_debug_check(struct lov_stripe_md *lsm,
                 rc2 = block_debug_check("test_brw", 
                                         addr + delta, OBD_ECHO_BLOCK_SIZE, 
                                         stripe_off, stripe_id);
-                if (rc2 != 0)
+                if (rc2 != 0) {
+                        CERROR ("Error in echo object "LPX64"\n", id);
                         rc = rc2;
+                }
         }
 
         kunmap(page);
@@ -501,10 +503,10 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa,
         int                     verify = 0;
         int                     gfp_mask;
 
-        /* oa_id == ECHO_PERSISTENT_OBJID => speed test (no verification).
-         * oa & 1                         => use HIGHMEM */
+        verify = ((oa->o_id) != ECHO_PERSISTENT_OBJID &&
+                  (oa->o_valid & OBD_MD_FLFLAGS) != 0 &&
+                  (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0);
 
-        verify = (oa->o_id) != ECHO_PERSISTENT_OBJID;
         gfp_mask = ((oa->o_id & 2) == 0) ? GFP_KERNEL : GFP_HIGHUSER;
 
         LASSERT(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ);
@@ -534,7 +536,7 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa,
                         goto out;
 
                 pgp->count = PAGE_SIZE;
-                pgp->off = off;
+                pgp->disk_offset = pgp->page_offset = off;
                 pgp->flag = 0;
 
                 if (verify)
@@ -555,7 +557,8 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa,
                 if (verify) {
                         int vrc;
                         vrc = echo_client_page_debug_check(lsm, pgp->pg, oa->o_id,
-                                                           pgp->off, pgp->count);
+                                                           pgp->page_offset, 
+                                                           pgp->count);
                         if (vrc != 0 && rc == 0)
                                 rc = vrc;
                 }
@@ -614,7 +617,7 @@ static int echo_client_ubrw(struct obd_device *obd, int rw,
         for (i = 0, off = offset, pgp = pga;
              i < npages;
              i++, off += PAGE_SIZE, pgp++) {
-                pgp->off = off;
+                pgp->disk_offset = pgp->page_offset = off;
                 pgp->pg = kiobuf->maplist[i];
                 pgp->count = PAGE_SIZE;
                 pgp->flag = 0;
@@ -721,7 +724,9 @@ static void ec_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
         eas = eap->eap_eas;
 
         if (cmd == OBD_BRW_READ &&
-            eas->eas_oa.o_id != ECHO_PERSISTENT_OBJID)
+            eas->eas_oa.o_id != ECHO_PERSISTENT_OBJID &&
+            (eas->eas_oa.o_valid & OBD_MD_FLFLAGS) != 0 &&
+            (eas->eas_oa.o_flags & OBD_FL_DEBUG_CHECK) != 0)
                 echo_client_page_debug_check(eas->eas_lsm, eap->eap_page, 
                                              eas->eas_oa.o_id, eap->eap_off,
                                              PAGE_SIZE);
@@ -846,7 +851,9 @@ static int echo_client_async_page(struct obd_export *exp, int rw,
                         break;
                 }
 
-                if (oa->o_id != ECHO_PERSISTENT_OBJID)
+                if (oa->o_id != ECHO_PERSISTENT_OBJID &&
+                    (oa->o_valid & OBD_MD_FLFLAGS) != 0 &&
+                    (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0)
                         echo_client_page_debug_setup(lsm, eap->eap_page, rw, 
                                                      oa->o_id, 
                                                      eap->eap_off, PAGE_SIZE);
@@ -950,9 +957,12 @@ static int echo_client_prep_commit(struct obd_export *exp, int rw,
                         if (page == NULL && lnb[i].rc == 0)
                                 continue;
 
-                        if (oa->o_id == ECHO_PERSISTENT_OBJID)
+                        if (oa->o_id == ECHO_PERSISTENT_OBJID ||
+                            (oa->o_valid & OBD_MD_FLFLAGS) == 0 ||
+                            (oa->o_flags & OBD_FL_DEBUG_CHECK) == 0)
                                 continue;
 
+
                         if (rw == OBD_BRW_WRITE)
                                 echo_client_page_debug_setup(lsm, page, rw,
                                                              oa->o_id,
diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c
index 4faa1eff86..ab194ce2dc 100644
--- a/lustre/obdfilter/filter.c
+++ b/lustre/obdfilter/filter.c
@@ -41,9 +41,12 @@
 #include <linux/dcache.h>
 #include <linux/init.h>
 #include <linux/version.h>
+#include <linux/jbd.h>
+#include <linux/ext3_fs.h>
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
 # include <linux/mount.h>
 # include <linux/buffer_head.h>
+# include <linux/bio.h>
 #endif
 
 #include <linux/obd_class.h>
@@ -108,6 +111,7 @@ int filter_finish_transno(struct obd_export *exp, struct obd_trans_info *oti,
                                 cpu_to_le64(last_rcvd);
                 spin_unlock(&filter->fo_translock);
         }
+        
         fcd->fcd_last_rcvd = cpu_to_le64(last_rcvd);
 
         /* could get xid from oti, if it's ever needed */
@@ -480,9 +484,10 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
                  * need to be set up like real exports as filter_connect() does.
                  */
                 exp = class_new_export(obd);
-                CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64
-                       " srv lr: "LPU64"\n", fcd->fcd_uuid, cl_idx,
-                       last_rcvd, le64_to_cpu(fsd->fsd_last_transno));
+                CDEBUG(D_HA, "RCVRNG CLIENT uuid: %s idx: %d lr: "LPU64" "
+                       "srv lr: "LPU64" fcd_group %d \n", fcd->fcd_uuid, cl_idx,
+                       last_rcvd, le64_to_cpu(fsd->fsd_last_transno), 
+                       le32_to_cpu(fcd->fcd_group));
                 if (exp == NULL)
                         GOTO(err_client, rc = -ENOMEM);
 
@@ -490,6 +495,7 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
                        sizeof exp->exp_client_uuid.uuid);
                 fed = &exp->exp_filter_data;
                 fed->fed_fcd = fcd;
+                fed->fed_group = le32_to_cpu(fcd->fcd_group);
                 filter_client_add(obd, filter, fed, cl_idx);
                 /* create helper if export init gets more complex */
                 spin_lock_init(&fed->fed_lock);
@@ -511,8 +517,9 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
         obd->obd_last_committed = le64_to_cpu(fsd->fsd_last_transno);
 
         if (obd->obd_recoverable_clients) {
-                CWARN("RECOVERY: %d recoverable clients, last_rcvd "
-                      LPU64"\n", obd->obd_recoverable_clients,
+                CWARN("RECOVERY: service %s, %d recoverable clients, "
+                      "last_transno "LPU64"\n", obd->obd_name,
+                      obd->obd_recoverable_clients,
                       le64_to_cpu(fsd->fsd_last_transno));
                 obd->obd_next_recovery_transno = obd->obd_last_committed + 1;
                 target_start_recovery_thread(obd, ost_handle);
@@ -527,8 +534,9 @@ out:
 
         /* save it, so mount count and last_transno is current */
         rc = filter_update_server_data(obd, filp, filter->fo_fsd, 1);
-
-        RETURN(rc);
+        if (rc)
+                GOTO(err_client, rc);
+        RETURN(0);
 
 err_client:
         class_disconnect_exports(obd, 0);
@@ -1173,10 +1181,17 @@ struct dentry *filter_fid2dentry(struct obd_device *obd,
         if (dir_dentry == NULL)
                 filter_parent_unlock(dparent, lock);
         if (IS_ERR(dchild)) {
-                CERROR("child lookup error %ld\n", PTR_ERR(dchild));
+                CERROR("%s: child lookup error %ld\n", obd->obd_name,
+                       PTR_ERR(dchild));
                 RETURN(dchild);
         }
 
+        if (dchild->d_inode != NULL && is_bad_inode(dchild->d_inode)) {
+                CERROR("%s: got bad inode "LPU64"\n", obd->obd_name, id);
+                f_dput(dchild);
+                RETURN(ERR_PTR(-ENOENT));
+        }
+
         CDEBUG(D_INODE, "got child objid %s: %p, count = %d\n",
                name, dchild, atomic_read(&dchild->d_count));
 
@@ -1244,10 +1259,10 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         struct ldlm_resource *res = lock->l_resource;
         ldlm_processing_policy policy;
         struct ost_lvb *res_lvb, *reply_lvb;
+        struct ldlm_reply *rep;
         struct list_head *tmp;
         ldlm_error_t err;
-        int tmpflags = 0, rc, repsize[2] = {sizeof(struct ldlm_reply),
-                                            sizeof(struct ost_lvb) };
+        int tmpflags = 0, rc, repsize[2] = {sizeof(*rep), sizeof(*reply_lvb)};
         ENTRY;
 
         policy = ldlm_get_processing_policy(res);
@@ -1258,6 +1273,9 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         if (rc)
                 RETURN(req->rq_status = rc);
 
+        rep = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*rep));
+        LASSERT(rep != NULL);
+
         reply_lvb = lustre_msg_buf(req->rq_repmsg, 1, sizeof(*reply_lvb));
         LASSERT(reply_lvb != NULL);
 
@@ -1299,8 +1317,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         down(&res->lr_lvb_sem);
         res_lvb = res->lr_lvb_data;
         LASSERT(res_lvb != NULL);
-        reply_lvb->lvb_size = res_lvb->lvb_size;
-        reply_lvb->lvb_blocks = res_lvb->lvb_blocks;
+        *reply_lvb = *res_lvb;
         up(&res->lr_lvb_sem);
 
         list_for_each(tmp, &res->lr_granted) {
@@ -1331,7 +1348,14 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         if (l == NULL)
                 RETURN(ELDLM_LOCK_ABORTED);
 
-        LASSERT(l->l_glimpse_ast != NULL);
+        if (l->l_glimpse_ast == NULL) {
+                /* We are racing with unlink(); just return -ENOENT */
+                rep->lock_policy_res1 = -ENOENT;
+                goto out;
+        }
+
+        LASSERTF(l->l_glimpse_ast != NULL, "l == %p", l);
+
         rc = l->l_glimpse_ast(l, NULL); /* this will update the LVB */
         if (rc != 0 && res->lr_namespace->ns_lvbo &&
             res->lr_namespace->ns_lvbo->lvbo_update) {
@@ -1339,10 +1363,9 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         }
 
         down(&res->lr_lvb_sem);
-        reply_lvb->lvb_size = res_lvb->lvb_size;
-        reply_lvb->lvb_blocks = res_lvb->lvb_blocks;
+        *reply_lvb = *res_lvb;
         up(&res->lr_lvb_sem);
-
+out:
         LDLM_LOCK_PUT(l);
 
         RETURN(ELDLM_LOCK_ABORTED);
@@ -1403,13 +1426,13 @@ static int filter_post_fs_setup(struct obd_device *obd)
 }
 
 /* mount the file system (secretly) */
-int filter_common_setup(struct obd_device *obd, obd_count len,
-                        void *buf, char *option)
+int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
+                        char *option)
 {
         struct lustre_cfg* lcfg = buf;
         struct filter_obd *filter = &obd->u.filter;
         struct vfsmount *mnt;
-        char name[32] = "CATLIST";
+        char ns_name[48];
         int rc = 0, i;
         ENTRY;
 
@@ -1483,8 +1506,9 @@ int filter_common_setup(struct obd_device *obd, obd_count len,
         INIT_LIST_HEAD(&filter->fo_llog_list);
         spin_lock_init(&filter->fo_llog_list_lock);
 
-        obd->obd_namespace = ldlm_namespace_new("filter-tgt",
-                                                LDLM_NAMESPACE_SERVER);
+        sprintf(ns_name, "filter-%s", obd->obd_uuid.uuid);
+        obd->obd_namespace = ldlm_namespace_new(ns_name, LDLM_NAMESPACE_SERVER);
+
         if (obd->obd_namespace == NULL)
                 GOTO(err_post, rc = -ENOMEM);
         obd->obd_namespace->ns_lvbp = obd;
@@ -1494,7 +1518,7 @@ int filter_common_setup(struct obd_device *obd, obd_count len,
         ptlrpc_init_client(LDLM_CB_REQUEST_PORTAL, LDLM_CB_REPLY_PORTAL,
                            "filter_ldlm_cb_client", &obd->obd_ldlm_client);
 
-        rc = obd_llog_cat_initialize(obd, &obd->obd_llogs, 1, name);
+        rc = obd_llog_cat_initialize(obd, &obd->obd_llogs, 1, CATLIST);
         if (rc) {
                 CERROR("failed to setup llogging subsystems\n");
                 GOTO(err_post, rc);
@@ -1575,6 +1599,8 @@ static int filter_cleanup(struct obd_device *obd, int flags)
                 }
         }
 
+        target_cleanup_recovery(obd);
+        
         ldlm_namespace_free(obd->obd_namespace, flags & OBD_OPT_FORCE);
 
         if (filter->fo_sb == NULL)
@@ -1659,6 +1685,8 @@ static int filter_connect(struct lustre_handle *conn, struct obd_device *obd,
 
         spin_lock_init(&fed->fed_lock);
 
+       /* connection from MDS */
+        group = connect_flags;
         if (obd->obd_replayable) {
                 OBD_ALLOC(fcd, sizeof(*fcd));
                 if (!fcd) {
@@ -1668,19 +1696,16 @@ static int filter_connect(struct lustre_handle *conn, struct obd_device *obd,
 
                 memcpy(fcd->fcd_uuid, cluuid, sizeof(fcd->fcd_uuid));
                 fed->fed_fcd = fcd;
-
+                fed->fed_fcd->fcd_group = group;
                 rc = filter_client_add(obd, filter, fed, -1);
                 if (rc)
                         GOTO(cleanup, rc);
         }
-
-        if (connect_flags == 0)
-                GOTO(cleanup, rc);
-
-        /* connection from MDS */
-        group = connect_flags;
         CWARN("%s: Received MDS connection ("LPX64"); group %d\n",
               obd->obd_name, exp->exp_handle.h_cookie, group);
+ 
+        if (group == 0)
+                GOTO(cleanup, rc);
         
         if (fed->fed_group != 0 && fed->fed_group != group) {
                 char str[PTL_NALFMT_SIZE];
@@ -2529,7 +2554,7 @@ static int filter_destroy(struct obd_export *exp, struct obdo *oa,
                 goto acquire_locks;
         }
 
-        handle = fsfilt_start_log(obd, dparent->d_inode, FSFILT_OP_UNLINK, oti, 1);
+        handle = fsfilt_start_log(obd, dparent->d_inode,FSFILT_OP_UNLINK,oti,1);
         if (IS_ERR(handle))
                 GOTO(cleanup, rc = PTR_ERR(handle));
 
diff --git a/lustre/obdfilter/filter_internal.h b/lustre/obdfilter/filter_internal.h
index 0ad0e3eb53..12ad087c0e 100644
--- a/lustre/obdfilter/filter_internal.h
+++ b/lustre/obdfilter/filter_internal.h
@@ -70,7 +70,8 @@ struct filter_client_data {
         __u8  fcd_uuid[40];        /* client UUID */
         __u64 fcd_last_rcvd;       /* last completed transaction ID */
         __u64 fcd_last_xid;        /* client RPC xid for the last transaction */
-        __u8  fcd_padding[FILTER_LR_CLIENT_SIZE - 56];
+        __u32 fcd_group;           /* client group num*/
+        __u8  fcd_padding[FILTER_LR_CLIENT_SIZE - 60];
 };
 
 #define FILTER_DENTRY_MAGIC 0x9efba101
@@ -87,7 +88,7 @@ enum {
         LPROC_FILTER_LAST,
 };
 
-#define FILTER_MAX_CACHE_SIZE OBD_OBJECT_EOF
+#define FILTER_MAX_CACHE_SIZE (32 * 1024 * 1024) /* was OBD_OBJECT_EOF */
 
 /* filter.c */
 void f_dput(struct dentry *);
@@ -126,10 +127,9 @@ int filter_brw(int cmd, struct obd_export *, struct obdo *,
 	       struct lov_stripe_md *, obd_count oa_bufs, struct brw_page *,
 	       struct obd_trans_info *);
 void flip_into_page_cache(struct inode *inode, struct page *new_page);
-void filter_release_read_page(struct filter_obd *filter, struct inode *inode,
-                              struct page *page);
-void filter_release_write_page(struct filter_obd *filter, struct inode *inode,
-                               struct niobuf_local *lnb, int rc);
+
+void filter_free_dio_pages(int objcount, struct obd_ioobj *obj,
+                           int niocount, struct niobuf_local *res);
 
 /* filter_io_*.c */
 int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
@@ -142,6 +142,14 @@ long filter_grant(struct obd_export *exp, obd_size current_grant,
 void filter_grant_commit(struct obd_export *exp, int niocount,
                          struct niobuf_local *res);
 
+int filter_alloc_iobuf(int rw, int num_pages, void **ret);
+void filter_free_iobuf(void *iobuf);
+int filter_iobuf_add_page(struct obd_device *obd, void *iobuf,
+                          struct inode *inode, struct page *page);
+int filter_direct_io(int rw, struct dentry *dchild, void *iobuf,
+                     struct obd_export *exp, struct iattr *attr,
+                     struct obd_trans_info *oti, void **wait_handle);
+
 /* filter_log.c */
 struct ost_filterdata {
         __u32  ofd_epoch;
diff --git a/lustre/obdfilter/filter_io.c b/lustre/obdfilter/filter_io.c
index 10cc687fe0..8b09fc74c5 100644
--- a/lustre/obdfilter/filter_io.c
+++ b/lustre/obdfilter/filter_io.c
@@ -37,52 +37,47 @@
 #include <linux/lustre_snap.h>
 #include "filter_internal.h"
 
-static int filter_start_page_read(struct obd_device *obd, struct inode *inode,
-                                  struct niobuf_local *lnb)
+static int filter_alloc_dio_page(struct obd_device *obd, struct inode *inode,
+                                 struct niobuf_local *lnb)
+
 {
         struct page *page;
-        unsigned long index = lnb->offset >> PAGE_SHIFT;
-
-        page = fsfilt_getpage(obd, inode, index);
-        if (IS_ERR(page)) {
-                CERROR("page index %lu, rc = %ld\n", index, PTR_ERR(page));
+        ENTRY;
+ 
+        page = alloc_pages(GFP_HIGHUSER, 0);
+        if (page == NULL) {
+                CERROR("no memory for a temp page\n");
+                lnb->rc = -ENOMEM;
+                RETURN(-ENOMEM);
+        }
 
-                lnb->page = NULL;
-                lnb->rc = PTR_ERR(page);
-                return lnb->rc;
+#if 0
+        POISON_PAGE(page, 0xf1);
+        if (lnb->len != PAGE_SIZE) {
+                memset(kmap(page) + lnb->len, 0, PAGE_SIZE - lnb->len);
+                kunmap(page);
         }
+#endif
+        page->index = lnb->offset >> PAGE_SHIFT;
 
         lnb->page = page;
 
-        return 0;
+        RETURN(0);
 }
 
-static int filter_finish_page_read(struct niobuf_local *lnb)
+void filter_free_dio_pages(int objcount, struct obd_ioobj *obj,
+                           int niocount, struct niobuf_local *res)
 {
-        if (lnb->page == NULL)
-                return 0;
-
-        if (PageUptodate(lnb->page))
-                return 0;
+        int i, j;
 
-        wait_on_page(lnb->page);
-        if (!PageUptodate(lnb->page)) {
-                CERROR("page index %lu/offset "LPX64" not uptodate\n",
-                       lnb->page->index, lnb->offset);
-                GOTO(err_page, lnb->rc = -EIO);
-        }
-        if (PageError(lnb->page)) {
-                CERROR("page index %lu/offset "LPX64" has error\n",
-                       lnb->page->index, lnb->offset);
-                GOTO(err_page, lnb->rc = -EIO);
+        for (i = 0; i < objcount; i++, obj++) {
+                for (j = 0 ; j < obj->ioo_bufcnt ; j++, res++) {
+                        if (res->page != NULL) {
+                                __free_page(res->page);
+                                res->page = NULL;
+                        }
+                }
         }
-
-        return 0;
-
-err_page:
-        page_cache_release(lnb->page);
-        lnb->page = NULL;
-        return lnb->rc;
 }
 
 /* Grab the dirty and seen grant announcements from the incoming obdo.
@@ -263,6 +258,7 @@ long filter_grant(struct obd_export *exp, obd_size current_grant,
         return grant;
 }
 
+
 static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
                               int objcount, struct obd_ioobj *obj,
                               int niocount, struct niobuf_remote *nb,
@@ -271,106 +267,84 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
 {
         struct obd_device *obd = exp->exp_obd;
         struct lvfs_run_ctxt saved;
-        struct obd_ioobj *o;
         struct niobuf_remote *rnb;
-        struct niobuf_local *lnb = NULL;
-        struct fsfilt_objinfo *fso;
-        struct dentry *dentry;
+        struct niobuf_local *lnb;
+        struct dentry *dentry = NULL;
         struct inode *inode;
-        int rc = 0, i, j, tot_bytes = 0, cleanup_phase = 0;
+        void *iobuf = NULL; 
+        int rc = 0, i, tot_bytes = 0;
         unsigned long now = jiffies;
         ENTRY;
 
         /* We are currently not supporting multi-obj BRW_READ RPCS at all.
          * When we do this function's dentry cleanup will need to be fixed */
-        LASSERT(objcount == 1);
-        LASSERT(obj->ioo_bufcnt > 0);
+        LASSERTF(objcount == 1, "%d\n", objcount);
+        LASSERTF(obj->ioo_bufcnt > 0, "%d\n", obj->ioo_bufcnt);
 
         if (oa && oa->o_valid & OBD_MD_FLGRANT) {
                 spin_lock(&obd->obd_osfs_lock);
                 filter_grant_incoming(exp, oa);
 
-#if 0
-                /* Reads do not increase grants */
-                oa->o_grant = filter_grant(exp, oa->o_grant, oa->o_undirty,
-                                           filter_grant_space_left(exp));
-#else
                 oa->o_grant = 0;
-#endif
+                
                 spin_unlock(&obd->obd_osfs_lock);
         }
 
-        OBD_ALLOC(fso, objcount * sizeof(*fso));
-        if (fso == NULL)
-                RETURN(-ENOMEM);
-
         memset(res, 0, niocount * sizeof(*res));
 
         push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
-        for (i = 0, o = obj; i < objcount; i++, o++) {
-                LASSERT(o->ioo_bufcnt);
-
-                dentry = filter_oa2dentry(obd, oa);
-                if (IS_ERR(dentry))
-                        GOTO(cleanup, rc = PTR_ERR(dentry));
+        rc = filter_alloc_iobuf(OBD_BRW_READ, obj->ioo_bufcnt, &iobuf);
+        if (rc)
+                GOTO(cleanup, rc);
 
-                if (dentry->d_inode == NULL) {
-                        CERROR("trying to BRW to non-existent file "LPU64"\n",
-                               o->ioo_id);
-                        f_dput(dentry);
-                        GOTO(cleanup, rc = -ENOENT);
-                }
+        dentry = filter_oa2dentry(obd, oa);
+        if (IS_ERR(dentry))
+                GOTO(cleanup, rc = PTR_ERR(dentry));
 
-                fso[i].fso_dentry = dentry;
-                fso[i].fso_bufcnt = o->ioo_bufcnt;
+        if (dentry->d_inode == NULL) {
+                CERROR("trying to BRW to non-existent file "LPU64"\n",
+                               obj->ioo_id);
+                GOTO(cleanup, rc = -ENOENT);
         }
 
+        inode = dentry->d_inode; 
+
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("slow preprw_read setup %lus\n", (jiffies - now) / HZ);
         else
                 CDEBUG(D_INFO, "preprw_read setup: %lu jiffies\n",
                        (jiffies - now));
 
-        for (i = 0, o = obj, rnb = nb, lnb = res; i < objcount; i++, o++) {
-                dentry = fso[i].fso_dentry;
-                inode = dentry->d_inode;
-
-                for (j = 0; j < o->ioo_bufcnt; j++, rnb++, lnb++) {
-                        lnb->dentry = dentry;
-                        lnb->offset = rnb->offset;
-                        lnb->len    = rnb->len;
-                        lnb->flags  = rnb->flags;
-
-                        if (inode->i_size <= rnb->offset) {
-                                /* If there's no more data, abort early.
-                                 * lnb->page == NULL and lnb->rc == 0, so it's
-                                 * easy to detect later. */
-                                break;
-                        } else {
-                                rc = filter_start_page_read(obd, inode, lnb);
-                        }
+        for (i = 0, lnb = res, rnb = nb; i < obj->ioo_bufcnt;
+             i++, rnb++, lnb++) {
+                lnb->dentry = dentry;
+                lnb->offset = rnb->offset;
+                lnb->len    = rnb->len;
+                lnb->flags  = rnb->flags;
 
-                        if (rc) {
-                                CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
-                                       "page err %u@"LPU64" %u/%u %p: rc %d\n",
-                                       lnb->len, lnb->offset, j, o->ioo_bufcnt,
-                                       dentry, rc);
-                                cleanup_phase = 1;
-                                GOTO(cleanup, rc);
-                        }
+                if (inode->i_size <= rnb->offset)
+                      /* If there's no more data, abort early.
+                      * lnb->page == NULL and lnb->rc == 0, so it's
+                      * easy to detect later. */
+                        break;
+                else
+                        rc = filter_alloc_dio_page(obd, inode, lnb);
+                if (rc) {
+                        CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
+                             "page err %u@"LPU64" %u/%u %p: rc %d\n",
+                              lnb->len, lnb->offset, i, obj->ioo_bufcnt,
+                              dentry, rc);
+                        GOTO(cleanup, rc);
+                }
 
-                        if (inode->i_size < lnb->offset + lnb->len - 1)
-                                lnb->rc = inode->i_size - lnb->offset;
-                        else
-                                lnb->rc = lnb->len;
+                if (inode->i_size < lnb->offset + lnb->len - 1)
+                        lnb->rc = inode->i_size - lnb->offset;
+                else
+                        lnb->rc = lnb->len;
 
-                        tot_bytes += lnb->rc;
-                        if (lnb->rc < lnb->len) {
-                                /* short read, be sure to wait on it */
-                                lnb++;
-                                break;
-                        }
-                }
+                tot_bytes += lnb->rc;
+
+                filter_iobuf_add_page(obd, iobuf, inode, lnb->page);
         }
 
         if (time_after(jiffies, now + 15 * HZ))
@@ -379,42 +353,33 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
                 CDEBUG(D_INFO, "start_page_read: %lu jiffies\n",
                        (jiffies - now));
 
-        lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_READ_BYTES, tot_bytes);
-        while (lnb-- > res) {
-                rc = filter_finish_page_read(lnb);
-                if (rc) {
-                        CERROR("error page %u@"LPU64" %u %p: rc %d\n", lnb->len,
-                               lnb->offset, (int)(lnb - res), lnb->dentry, rc);
-                        cleanup_phase = 1;
-                        GOTO(cleanup, rc);
-                }
-        }
+        rc = filter_direct_io(OBD_BRW_READ, dentry, iobuf, exp,
+                              NULL, NULL, NULL);
+        if (rc)
+                GOTO(cleanup, rc);
 
-        if (time_after(jiffies, now + 15 * HZ))
-                CERROR("slow finish_page_read %lus\n", (jiffies - now) / HZ);
-        else
-                CDEBUG(D_INFO, "finish_page_read: %lu jiffies\n",
-                       (jiffies - now));
+        lprocfs_counter_add(obd->obd_stats, LPROC_FILTER_READ_BYTES, tot_bytes);
 
         filter_tally_read(&exp->exp_obd->u.filter, res, niocount);
 
         EXIT;
 
- cleanup:
-        switch (cleanup_phase) {
-        case 1:
-                for (lnb = res; lnb < (res + niocount); lnb++) {
-                        if (lnb->page)
-                                page_cache_release(lnb->page);
-                }
-                if (res->dentry != NULL)
-                        f_dput(res->dentry);
+cleanup:
+        if (rc != 0) {
+                filter_free_dio_pages(objcount, obj, niocount, res);
+
+                if (dentry != NULL)
+                        f_dput(dentry);
                 else
                         CERROR("NULL dentry in cleanup -- tell CFS\n");
-        case 0:
-                OBD_FREE(fso, objcount * sizeof(*fso));
-                pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
         }
+
+        if (iobuf != NULL)
+                filter_free_iobuf(iobuf);
+
+        pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
+        if (rc)
+                CERROR("io error %d\n", rc);
         return rc;
 }
 
@@ -525,55 +490,6 @@ static int filter_grant_check(struct obd_export *exp, int objcount,
         return rc;
 }
 
-static int filter_start_page_write(struct obd_device *obd, struct inode *inode,
-                                   struct niobuf_local *lnb)
-{
-        struct page *page;
-
-        if (lnb->len != PAGE_SIZE)
-                return filter_start_page_read(obd, inode, lnb);
-
-        page = alloc_pages(GFP_HIGHUSER, 0);
-        if (page == NULL) {
-                CERROR("no memory for a temp page\n");
-                RETURN(lnb->rc = -ENOMEM);
-        }
-#if 0
-        POISON_PAGE(page, 0xf1);
-        if (lnb->len != PAGE_SIZE) {
-                memset(kmap(page) + lnb->len, 0, PAGE_SIZE - lnb->len);
-                kunmap(page);
-        }
-#endif
-        page->index = lnb->offset >> PAGE_SHIFT;
-        lnb->page = page;
-
-        return 0;
-}
-
-static void filter_abort_page_write(struct niobuf_local *lnb)
-{
-        LASSERT(lnb->page != NULL);
-
-        if (lnb->len != PAGE_SIZE)
-                page_cache_release(lnb->page);
-        else
-                __free_pages(lnb->page, 0);
-}
-
-/* a helper for both the 2.4 and 2.6 commitrw paths which are both built
- * up by our shared filter_preprw_write() */
-void filter_release_write_page(struct filter_obd *filter, struct inode *inode,
-                               struct niobuf_local *lnb, int rc)
-{
-        if (lnb->len != PAGE_SIZE)
-                return filter_release_read_page(filter, inode, lnb->page);
-
-        if (rc == 0)
-                flip_into_page_cache(inode, lnb->page);
-        __free_page(lnb->page);
-}
-
 /* If we ever start to support multi-object BRW RPCs, we will need to get locks
  * on mulitple inodes.  That isn't all, because there still exists the
  * possibility of a truncate starting a new transaction while holding the ext3
@@ -592,24 +508,32 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
 {
         struct lvfs_run_ctxt saved;
         struct niobuf_remote *rnb;
-        struct niobuf_local *lnb;
+        struct niobuf_local *lnb = res;
         struct fsfilt_objinfo fso;
-        struct dentry *dentry;
+        struct dentry *dentry = NULL;
+        void *iobuf; 
         obd_size left;
         unsigned long now = jiffies;
-        int rc = 0, i, tot_bytes = 0, cleanup_phase = 1;
+        int rc = 0, i, tot_bytes = 0, cleanup_phase = 0;
         ENTRY;
         LASSERT(objcount == 1);
         LASSERT(obj->ioo_bufcnt > 0);
 
         memset(res, 0, niocount * sizeof(*res));
 
+        rc = filter_alloc_iobuf(OBD_BRW_READ, obj->ioo_bufcnt, &iobuf);
+        if (rc)
+                GOTO(cleanup, rc);
+        cleanup_phase = 1;
+
         push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
         dentry = filter_fid2dentry(exp->exp_obd, NULL, obj->ioo_gr,
                                    obj->ioo_id);
         if (IS_ERR(dentry))
                 GOTO(cleanup, rc = PTR_ERR(dentry));
-
+        
+        cleanup_phase = 2;
+        
         if (dentry->d_inode == NULL) {
                 CERROR("trying to BRW to non-existent file "LPU64"\n",
                        obj->ioo_id);
@@ -629,7 +553,8 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
         spin_lock(&exp->exp_obd->obd_osfs_lock);
         if (oa)
                 filter_grant_incoming(exp, oa);
-        cleanup_phase = 0;
+        
+        cleanup_phase = 3;
 
         left = filter_grant_space_left(exp);
 
@@ -640,10 +565,8 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
 
         spin_unlock(&exp->exp_obd->obd_osfs_lock);
 
-        if (rc) {
-                f_dput(dentry);
+        if (rc) 
                 GOTO(cleanup, rc);
-        }
 
         for (i = 0, rnb = nb, lnb = res; i < obj->ioo_bufcnt;
              i++, lnb++, rnb++) {
@@ -655,31 +578,39 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
                 lnb->len    = rnb->len;
                 lnb->flags  = rnb->flags;
 
-                rc = filter_start_page_write(exp->exp_obd, dentry->d_inode,lnb);
+                rc = filter_alloc_dio_page(exp->exp_obd, dentry->d_inode,lnb);
                 if (rc) {
                         CERROR("page err %u@"LPU64" %u/%u %p: rc %d\n",
                                lnb->len, lnb->offset,
                                i, obj->ioo_bufcnt, dentry, rc);
-                        while (lnb-- > res)
-                                filter_abort_page_write(lnb);
-                        f_dput(dentry);
                         GOTO(cleanup, rc);
                 }
+                cleanup_phase = 4;
+
+                /* If the filter writes a partial page, then has the file
+                 * extended, the client will read in the whole page.  the
+                 * filter has to be careful to zero the rest of the partial
+                 * page on disk.  we do it by hand for partial extending
+                 * writes, send_bio() is responsible for zeroing pages when
+                 * asked to read unmapped blocks -- brw_kiovec() does this. */
+                if (lnb->len != PAGE_SIZE) {
+                        if (lnb->offset + lnb->len < dentry->d_inode->i_size) {
+                                filter_iobuf_add_page(exp->exp_obd, iobuf,
+                                                      dentry->d_inode,
+                                                      lnb->page);
+                        } else {
+                                memset(kmap(lnb->page) + lnb->len, 0,
+                                       PAGE_SIZE - lnb->len);
+                                kunmap(lnb->page);
+                        }
+                }
                 if (lnb->rc == 0)
                         tot_bytes += lnb->len;
         }
 
-        while (lnb-- > res) {
-                if (lnb->len == PAGE_SIZE)
-                        continue;
-                rc = filter_finish_page_read(lnb);
-                if (rc) {
-                        CERROR("error page %u@"LPU64" %u %p: rc %d\n", lnb->len,
-                               lnb->offset, (int)(lnb - res), lnb->dentry, rc);
-                        GOTO(cleanup, rc);
-                }
-        }
-
+        rc = filter_direct_io(OBD_BRW_READ, dentry, iobuf, exp,
+                              NULL, NULL, NULL);
+        
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("slow start_page_write %lus\n", (jiffies - now) / HZ);
         else
@@ -691,15 +622,28 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
         EXIT;
 cleanup:
         switch(cleanup_phase) {
+        case 4:
+                if (rc)
+                        filter_free_dio_pages(objcount, obj, niocount, res);
+        case 3:
+                pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
+                filter_free_iobuf(iobuf);
+        case 2:
+                if (rc)
+                        f_dput(dentry);
+                break;
         case 1:
                 spin_lock(&exp->exp_obd->obd_osfs_lock);
                 if (oa)
                         filter_grant_incoming(exp, oa);
                 spin_unlock(&exp->exp_obd->obd_osfs_lock);
-        default: ;
+                pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
+                filter_free_iobuf(iobuf);
+                break;
+        default:;
+        
         }
-        pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
-        return rc;
+        RETURN(rc);
 }
 
 int filter_preprw(int cmd, struct obd_export *exp, struct obdo *oa,
@@ -742,24 +686,14 @@ static int filter_commitrw_read(struct obd_export *exp, struct obdo *oa,
                                 int niocount, struct niobuf_local *res,
                                 struct obd_trans_info *oti, int rc)
 {
-        struct obd_ioobj *o;
-        struct niobuf_local *lnb;
-        int i, j;
         struct inode *inode = NULL;
         ENTRY;
 
         if (res->dentry != NULL)
                 inode = res->dentry->d_inode;
 
-        for (i = 0, o = obj, lnb = res; i < objcount; i++, o++) {
-                for (j = 0 ; j < o->ioo_bufcnt ; j++, lnb++) {
-                        if (lnb->page == NULL)
-                                continue;
-                        filter_release_read_page(&exp->exp_obd->u.filter,
-                                                 inode, lnb->page);
-                }
-        }
-
+        filter_free_dio_pages(objcount, obj, niocount, res);
+        
         if (res->dentry != NULL)
                 f_dput(res->dentry);
         RETURN(rc);
@@ -992,7 +926,7 @@ int filter_brw(int cmd, struct obd_export *exp, struct obdo *oa,
                 GOTO(out, ret = -ENOMEM);
 
         for (i = 0; i < oa_bufs; i++) {
-                rnb[i].offset = pga[i].off;
+                rnb[i].offset = pga[i].disk_offset;
                 rnb[i].len = pga[i].count;
         }
 
@@ -1004,9 +938,16 @@ int filter_brw(int cmd, struct obd_export *exp, struct obdo *oa,
                 GOTO(out, ret);
 
         for (i = 0; i < oa_bufs; i++) {
-                void *virt = kmap(pga[i].pg);
-                obd_off off = pga[i].off & ~PAGE_MASK;
-                void *addr = kmap(lnb[i].page);
+                void *virt;
+                obd_off off;
+                void *addr;
+
+                if (lnb[i].page == NULL)
+                        break;
+
+                off = pga[i].disk_offset & ~PAGE_MASK;
+                virt = kmap(pga[i].pg);
+                addr = kmap(lnb[i].page);
 
                 /* 2 kmaps == vanishingly small deadlock opportunity */
 
diff --git a/lustre/obdfilter/filter_io_24.c b/lustre/obdfilter/filter_io_24.c
index a368f74a1c..2c59f68890 100644
--- a/lustre/obdfilter/filter_io_24.c
+++ b/lustre/obdfilter/filter_io_24.c
@@ -77,19 +77,74 @@ static void check_pending_bhs(unsigned long *blocks, int nr_pages, dev_t dev,
 #endif
 }
 
-/* Must be called with i_sem taken; this will drop it */
-static int filter_direct_io(int rw, struct dentry *dchild, struct kiobuf *iobuf,
-                            struct obd_export *exp, struct iattr *attr,
-                            struct obd_trans_info *oti, void **wait_handle)
+/* when brw_kiovec() is asked to read from block -1UL it just zeros
+ * the page.  this gives us a chance to verify the write mappings
+ * as well */
+static int filter_cleanup_mappings(int rw, struct kiobuf *iobuf,
+                                   struct inode *inode)
+{
+        int i, blocks_per_page_bits = PAGE_SHIFT - inode->i_blkbits;
+        ENTRY;
+
+        for (i = 0 ; i < iobuf->nr_pages << blocks_per_page_bits; i++) {
+                if (iobuf->blocks[i] > 0)
+                        continue;
+
+                if (rw == OBD_BRW_WRITE)
+                        RETURN(-EINVAL);
+
+                iobuf->blocks[i] = -1UL;
+        }
+        RETURN(0);
+}
+
+#if 0
+static void dump_page(int rw, unsigned long block, struct page *page)
+{
+        char *blah = kmap(page);
+        CDEBUG(D_PAGE, "rw %d block %lu: %02x %02x %02x %02x\n", rw, block,
+                       blah[0], blah[1], blah[2], blah[3]);
+        kunmap(page);
+}
+#endif
+
+static void filter_clear_page_cache(struct inode *inode, struct kiobuf *iobuf)
+{
+        struct page *page;
+        int i;
+
+        for (i = 0; i < iobuf->nr_pages ; i++) {
+                page = find_lock_page(inode->i_mapping,
+                                      iobuf->maplist[i]->index);
+                if (page == NULL)
+                        continue;
+                if (page->mapping != NULL) {
+                        block_flushpage(page, 0);
+                        truncate_complete_page(page);
+                }
+                unlock_page(page);
+                page_cache_release(page);
+        }
+}
+
+/* Must be called with i_sem taken for writes; this will drop it */
+int filter_direct_io(int rw, struct dentry *dchild, void *buf,
+                     struct obd_export *exp, struct iattr *attr,
+                     struct obd_trans_info *oti, void **wait_handle)
 {
         struct obd_device *obd = exp->exp_obd;
         struct inode *inode = dchild->d_inode;
-        int rc, create = (rw == OBD_BRW_WRITE), blocks_per_page;
-        int cleanup_phase = 0, *created = NULL;
-        int committed = 0;
+         struct kiobuf *iobuf = buf;
+        int rc, create = (rw == OBD_BRW_WRITE), *created = NULL, committed = 0;
+        int blocks_per_page = PAGE_SIZE >> inode->i_blkbits, cleanup_phase = 0;
+        struct semaphore *sem = NULL;
         ENTRY;
 
-        blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
+        LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
+
+        if (iobuf->nr_pages == 0)
+                GOTO(cleanup, rc = 0);
+
         if (iobuf->nr_pages * blocks_per_page > KIO_MAX_SECTORS)
                 GOTO(cleanup, rc = -EINVAL);
 
@@ -103,33 +158,49 @@ static int filter_direct_io(int rw, struct dentry *dchild, struct kiobuf *iobuf,
                 GOTO(cleanup, rc);
         cleanup_phase = 2;
 
+        if (rw == OBD_BRW_WRITE) {
+                create = 1;
+                sem = &obd->u.filter.fo_alloc_lock;
+        }
+        
         rc = fsfilt_map_inode_pages(obd, inode, iobuf->maplist,
                                     iobuf->nr_pages, iobuf->blocks, created,
-                                    create, &obd->u.filter.fo_alloc_lock);
+                                    create, sem);
         if (rc)
                 GOTO(cleanup, rc);
 
-        filter_tally_write(&obd->u.filter, iobuf->maplist, iobuf->nr_pages,
-                           iobuf->blocks, blocks_per_page);
-
-        if (attr->ia_size > inode->i_size)
-                attr->ia_valid |= ATTR_SIZE;
-        rc = fsfilt_setattr(obd, dchild, oti->oti_handle, attr, 0);
+        rc = filter_cleanup_mappings(rw, iobuf, inode);
         if (rc)
                 GOTO(cleanup, rc);
 
-        up(&inode->i_sem);
-        cleanup_phase = 3;
+        if (rw == OBD_BRW_WRITE) {
+                filter_tally_write(&obd->u.filter, iobuf->maplist,
+                                   iobuf->nr_pages, iobuf->blocks,
+                                   blocks_per_page);
 
-        rc = filter_finish_transno(exp, oti, 0);
-        if (rc)
-                GOTO(cleanup, rc);
+                if (attr->ia_size > inode->i_size)
+                        attr->ia_valid |= ATTR_SIZE;
+                rc = fsfilt_setattr(obd, dchild, oti->oti_handle, attr, 0);
+                if (rc)
+                        GOTO(cleanup, rc);
+                up(&inode->i_sem);
+                cleanup_phase = 3;
+                rc = filter_finish_transno(exp, oti, 0);
+                if (rc)
+                        GOTO(cleanup, rc);
+
+                rc = fsfilt_commit_async(obd,inode,oti->oti_handle,wait_handle);
+                committed = 1;
+                if (rc)
+                        GOTO(cleanup, rc);
+        }
 
-        rc = fsfilt_commit_async(obd, inode, oti->oti_handle, wait_handle);
-        oti->oti_handle = NULL;
-        committed = 1;
-        if (rc)
-                GOTO(cleanup, rc);
+        /* these are our hacks to keep our directio/bh IO coherent with ext3's
+         * page cache use.  Most notably ext3 reads file data into the page
+         * cache when it is zeroing the tail of partial-block truncates and
+         * leaves it there, sometimes generating io from it at later truncates.
+         * Someday very soon we'll be performing our brw_kiovec() IO to and
+         * from the page cache. */
 
         check_pending_bhs(iobuf->blocks, iobuf->nr_pages, inode->i_dev,
                           1 << inode->i_blkbits);
@@ -142,7 +213,11 @@ static int filter_direct_io(int rw, struct dentry *dchild, struct kiobuf *iobuf,
         if (rc < 0)
                 GOTO(cleanup, rc);
 
-        rc = fsfilt_send_bio(obd, inode, iobuf);
+        /* be careful to call this after fsync_inode_data_buffers has waited
+         * for IO to complete before we evict it from the cache */
+        filter_clear_page_cache(inode, iobuf);
+
+        rc = fsfilt_send_bio(rw, obd, inode, iobuf);
 
         CDEBUG(D_INFO, "tried to write %d pages, rc = %d\n",
                iobuf->nr_pages, rc);
@@ -152,7 +227,7 @@ static int filter_direct_io(int rw, struct dentry *dchild, struct kiobuf *iobuf,
 
         EXIT;
 cleanup:
-        if (!committed) {
+        if (!committed && (rw == OBD_BRW_WRITE)) {                
                 int err = fsfilt_commit_async(obd, inode,
                                               oti->oti_handle, wait_handle);
                 oti->oti_handle = NULL;
@@ -172,9 +247,8 @@ cleanup:
                 OBD_FREE(created, sizeof(*created) *
                          iobuf->nr_pages*blocks_per_page);
         case 0:
-                if (cleanup_phase == 3)
-                        break;
-                up(&inode->i_sem);
+                if (cleanup_phase != 3 && rw == OBD_BRW_WRITE)            
+                        up(&inode->i_sem);
                 break;
         default:
                 CERROR("corrupt cleanup_phase (%d)?\n", cleanup_phase);
@@ -185,7 +259,7 @@ cleanup:
 }
 
 /* See if there are unallocated parts in given file region */
-static int filter_range_is_mapped(struct inode *inode, obd_size offset, int len)
+int filter_range_is_mapped(struct inode *inode, obd_size offset, int len)
 {
         int (*fs_bmap)(struct address_space *, long) =
                 inode->i_mapping->a_ops->bmap;
@@ -198,13 +272,74 @@ static int filter_range_is_mapped(struct inode *inode, obd_size offset, int len)
         offset >>= inode->i_blkbits;
         len >>= inode->i_blkbits;
 
-        for (j = 0; j <= len; j++)
+        for (j = 0; j < len; j++)
                 if (fs_bmap(inode->i_mapping, offset + j) == 0)
                         return 0;
 
         return 1;
 }
 
+
+/* some kernels require alloc_kiovec callers to zero members through the use of
+ * map_user_kiobuf and unmap_.. we don't use those, so we have a little helper
+ * that makes sure we don't break the rules. */
+static void clear_kiobuf(struct kiobuf *iobuf)
+{
+        int i;
+
+        for (i = 0; i < iobuf->array_len; i++)
+                iobuf->maplist[i] = NULL;
+
+        iobuf->nr_pages = 0;
+        iobuf->offset = 0;
+        iobuf->length = 0;
+}
+
+int filter_alloc_iobuf(int rw, int num_pages, void **ret)
+{
+        int rc;
+        struct kiobuf *iobuf;
+        ENTRY;
+
+        LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
+
+        rc = alloc_kiovec(1, &iobuf);
+        if (rc)
+                RETURN(rc);
+
+        rc = expand_kiobuf(iobuf, num_pages);
+        if (rc) {
+                free_kiovec(1, &iobuf);
+                RETURN(rc);
+        }
+
+#ifdef HAVE_KIOBUF_DOVARY
+        iobuf->dovary = 0; /* this prevents corruption, not present in 2.4.20 */
+#endif
+        clear_kiobuf(iobuf);
+        *ret = iobuf;
+        RETURN(0);
+}
+
+void filter_free_iobuf(void *buf)
+{
+        struct kiobuf *iobuf = buf;
+
+        clear_kiobuf(iobuf);
+        free_kiovec(1, &iobuf);
+}
+
+int filter_iobuf_add_page(struct obd_device *obd, void *buf,
+                           struct inode *inode, struct page *page)
+{
+        struct kiobuf *iobuf = buf;
+
+        iobuf->maplist[iobuf->nr_pages++] = page;
+        iobuf->length += PAGE_SIZE;
+
+        return 0;
+}
+
 int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
                           struct obd_ioobj *obj, int niocount,
                           struct niobuf_local *res, struct obd_trans_info *oti,
@@ -215,7 +350,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
         struct niobuf_local *lnb;
         struct fsfilt_objinfo fso;
         struct iattr iattr = { 0 };
-        struct kiobuf *iobuf;
+        void *iobuf = NULL;
         struct inode *inode = NULL;
         int i, n, cleanup_phase = 0, err;
         unsigned long now = jiffies; /* DEBUGGING OST TIMEOUTS */
@@ -228,23 +363,11 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
         if (rc != 0)
                 GOTO(cleanup, rc);
 
-        rc = alloc_kiovec(1, &iobuf);
+        rc = filter_alloc_iobuf(OBD_BRW_WRITE, obj->ioo_bufcnt, &iobuf);
         if (rc)
                 GOTO(cleanup, rc);
         cleanup_phase = 1;
 
-#ifdef HAVE_KIOBUF_DOVARY
-        iobuf->dovary = 0; /* this prevents corruption, not present in 2.4.20 */
-#endif
-        rc = expand_kiobuf(iobuf, obj->ioo_bufcnt);
-        if (rc)
-                GOTO(cleanup, rc);
-
-        iobuf->offset = 0;
-        iobuf->length = 0;
-        iobuf->nr_pages = 0;
-
-        cleanup_phase = 1;
         fso.fso_dentry = res->dentry;
         fso.fso_bufcnt = obj->ioo_bufcnt;
         inode = res->dentry->d_inode;
@@ -254,16 +377,13 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
 
                 /* If overwriting an existing block, we don't need a grant */
                 if (!(lnb->flags & OBD_BRW_GRANTED) && lnb->rc == -ENOSPC &&
-                    filter_range_is_mapped(inode, lnb->offset, lnb->len))
+                     filter_range_is_mapped(inode, lnb->offset, lnb->len))    
                         lnb->rc = 0;
 
                 if (lnb->rc) /* ENOSPC, network RPC error */
                         continue;
 
-                iobuf->maplist[n++] = lnb->page;
-                iobuf->length += PAGE_SIZE;
-                iobuf->nr_pages++;
-
+                filter_iobuf_add_page(obd, iobuf, inode, lnb->page);
                 /* We expect these pages to be in offset order, but we'll
                  * be forgiving */
                 this_size = lnb->offset + lnb->len;
@@ -278,6 +398,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
         oti->oti_handle = fsfilt_brw_start(obd, objcount, &fso, niocount, res,
                                            oti);
         if (IS_ERR(oti->oti_handle)) {
+                up(&inode->i_sem);
                 rc = PTR_ERR(oti->oti_handle);
                 CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
                        "error starting transaction: rc = %d\n", rc);
@@ -289,6 +410,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
                 CERROR("slow brw_start %lus\n", (jiffies - now) / HZ);
 
         iattr_from_obdo(&iattr,oa,OBD_MD_FLATIME|OBD_MD_FLMTIME|OBD_MD_FLCTIME);
+        /* filter_direct_io drops i_sem */
         rc = filter_direct_io(OBD_BRW_WRITE, res->dentry, iobuf, exp, &iattr,
                               oti, &wait_handle);
         if (rc == 0)
@@ -312,16 +434,12 @@ cleanup:
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 LASSERT(current->journal_info == NULL);
         case 1:
-                free_kiovec(1, &iobuf);
+                filter_free_iobuf(iobuf);
         case 0:
-                for (i = 0, lnb = res; i < obj->ioo_bufcnt; i++, lnb++) {
-                        filter_release_write_page(&obd->u.filter,
-                                                  res->dentry->d_inode, lnb,
-                                                  rc);
-                }
-
+                filter_free_dio_pages(objcount, obj, niocount, res);
                 f_dput(res->dentry);
         }
 
         RETURN(rc);
 }
+
diff --git a/lustre/obdfilter/filter_io_26.c b/lustre/obdfilter/filter_io_26.c
index 95f826348e..24e6229bca 100644
--- a/lustre/obdfilter/filter_io_26.c
+++ b/lustre/obdfilter/filter_io_26.c
@@ -28,6 +28,7 @@
 #include <linux/module.h>
 #include <linux/pagemap.h> // XXX kill me soon
 #include <linux/version.h>
+#include <linux/buffer_head.h>
 
 #define DEBUG_SUBSYSTEM S_FILTER
 
@@ -41,11 +42,16 @@
 #define MAX_BLOCKS_PER_PAGE (PAGE_SIZE / 512)
 struct dio_request {
         atomic_t numreqs;       /* number of reqs being processed */
+        struct bio *bio_current;/* bio currently being constructed */
         struct bio *bio_list;   /* list of completed bios */
-        wait_queue_head_t wait;
-        int created[MAX_BLOCKS_PER_PAGE];
-        unsigned long blocks[MAX_BLOCKS_PER_PAGE];
-        spinlock_t lock;
+        wait_queue_head_t dr_wait;
+        int dr_num_pages;
+        int dr_rw;
+        int dr_error;
+        int dr_created[MAX_BLOCKS_PER_PAGE];
+        unsigned long dr_blocks[MAX_BLOCKS_PER_PAGE];
+        spinlock_t dr_lock;
+
 };
 
 static int dio_complete_routine(struct bio *bio, unsigned int done, int error)
@@ -53,26 +59,203 @@ static int dio_complete_routine(struct bio *bio, unsigned int done, int error)
         struct dio_request *dreq = bio->bi_private;
         unsigned long flags;
 
-        spin_lock_irqsave(&dreq->lock, flags);
+        spin_lock_irqsave(&dreq->dr_lock, flags);
         bio->bi_private = dreq->bio_list;
         dreq->bio_list = bio;
-        spin_unlock_irqrestore(&dreq->lock, flags);
+        spin_unlock_irqrestore(&dreq->dr_lock, flags);
         if (atomic_dec_and_test(&dreq->numreqs))
-                wake_up(&dreq->wait);
-
+                wake_up(&dreq->dr_wait);
+        if (dreq->dr_error == 0)
+                dreq->dr_error = error;
         return 0;
 }
 
 static int can_be_merged(struct bio *bio, sector_t sector)
 {
-        int size;
-
+        unsigned int size;
         if (!bio)
                 return 0;
 
         size = bio->bi_size >> 9;
         return bio->bi_sector + size == sector ? 1 : 0;
 }
+int filter_alloc_iobuf(int rw, int num_pages, void **ret)
+{
+        struct dio_request *dreq;
+
+        LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
+
+        OBD_ALLOC(dreq, sizeof(*dreq));
+        if (dreq == NULL)
+                RETURN(-ENOMEM);
+
+        dreq->bio_list = NULL;
+        init_waitqueue_head(&dreq->dr_wait);
+        atomic_set(&dreq->numreqs, 0);
+        spin_lock_init(&dreq->dr_lock);
+        dreq->dr_num_pages = num_pages;
+        dreq->dr_rw = rw;
+
+        *ret = dreq;
+        RETURN(0);
+}
+
+void filter_free_iobuf(void *iobuf)
+{
+        struct dio_request *dreq = iobuf;
+
+        /* free all bios */
+        while (dreq->bio_list) {
+                struct bio *bio = dreq->bio_list;
+                dreq->bio_list = bio->bi_private;
+                bio_put(bio);
+        }
+
+        OBD_FREE(dreq, sizeof(*dreq));
+}
+
+int filter_iobuf_add_page(struct obd_device *obd, void *iobuf,
+                          struct inode *inode, struct page *page)
+{
+        struct dio_request *dreq = iobuf;
+        int blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
+        unsigned int len = inode->i_sb->s_blocksize, offs;
+        struct bio *bio = dreq->bio_current;
+        sector_t sector;
+        int k, rc;
+        ENTRY;
+
+        /* get block number for next page */
+        rc = fsfilt_map_inode_pages(obd, inode, &page, 1, dreq->dr_blocks,
+                                    dreq->dr_created,
+                                    dreq->dr_rw == OBD_BRW_WRITE, NULL);
+        if (rc)
+                RETURN(rc);
+
+        for (k = 0, offs = 0; k < blocks_per_page; k++, offs += len) {
+                if (dreq->dr_created[k] == -1) {
+                        memset(kmap(page) + offs, 0, len);
+                        kunmap(page);
+                        continue;
+                }
+
+                sector = dreq->dr_blocks[k] <<(inode->i_sb->s_blocksize_bits-9);
+
+                if (!bio || !can_be_merged(bio, sector) ||
+                    !bio_add_page(bio, page, len, offs)) {
+                        if (bio) {
+                                atomic_inc(&dreq->numreqs);
+                                /* FIXME
+                                filter_tally_write(&obd->u.filter,dreq->maplist,
+                                                   dreq->nr_pages,dreq->blocks,
+                                                   blocks_per_page);
+                                */
+                                fsfilt_send_bio(dreq->dr_rw, obd, inode, bio);
+                                dreq->bio_current = bio = NULL;
+                        }
+                        /* allocate new bio */
+                        dreq->bio_current = bio =
+                                bio_alloc(GFP_NOIO, dreq->dr_num_pages *
+                                                    blocks_per_page);
+                        bio->bi_bdev = inode->i_sb->s_bdev;
+                        bio->bi_sector = sector;
+                        bio->bi_end_io = dio_complete_routine;
+                        bio->bi_private = dreq;
+
+                        if (!bio_add_page(bio, page, len, offs))
+                                LBUG();
+                }
+        }
+        dreq->dr_num_pages--;
+
+        RETURN(0);
+}
+
+static void filter_clear_page_cache(struct inode *inode, struct kiobuf *iobuf)
+{
+#if 0
+        struct page *page;
+        int i;
+
+        for (i = 0; i < iobuf->nr_pages ; i++) {
+                page = find_lock_page(inode->i_mapping,
+                                      iobuf->maplist[i]->index);
+                if (page == NULL)
+                        continue;
+                if (page->mapping != NULL) {
+                        block_invalidatepage(page, 0);
+                        truncate_complete_page(page);
+                }
+                unlock_page(page);
+                page_cache_release(page);
+        }
+#endif
+}
+
+/* Must be called with i_sem taken for writes; this will drop it */
+int filter_direct_io(int rw, struct dentry *dchild, void *iobuf,
+                     struct obd_export *exp, struct iattr *attr,
+                     struct obd_trans_info *oti, void **wait_handle)
+{
+        struct dio_request *dreq = iobuf;
+        struct inode *inode = dchild->d_inode;
+        int rc;
+        ENTRY;
+
+        LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
+
+        /* This is nearly osync_inode, without the waiting
+        rc = generic_osync_inode(inode, inode->i_mapping,
+                                 OSYNC_DATA|OSYNC_METADATA); */
+        rc = filemap_fdatawrite(inode->i_mapping);
+        if (rc == 0)
+                rc = sync_mapping_buffers(inode->i_mapping);
+        if (rc == 0)
+                rc = filemap_fdatawait(inode->i_mapping);
+        if (rc < 0)
+                GOTO(cleanup, rc);
+
+        if (rw == OBD_BRW_WRITE)
+                up(&inode->i_sem);
+
+        /* be careful to call this after fsync_inode_data_buffers has waited
+         * for IO to complete before we evict it from the cache */
+        filter_clear_page_cache(inode, iobuf);
+
+        if (dreq->bio_current != NULL) {
+                atomic_inc(&dreq->numreqs);
+                fsfilt_send_bio(rw, exp->exp_obd, inode, dreq->bio_current);
+                dreq->bio_current = NULL;
+        }
+
+        /* time to wait for I/O completion */
+        wait_event(dreq->dr_wait, atomic_read(&dreq->numreqs) == 0);
+
+        rc = dreq->dr_error;
+        if (rw == OBD_BRW_WRITE && rc == 0) {
+                /* FIXME:
+                filter_tally_write(&obd->u.filter, dreq->maplist,
+                                   dreq->nr_pages, dreq->blocks,
+                                   blocks_per_page);
+                */
+
+                if (attr->ia_size > inode->i_size) {
+                        CDEBUG(D_INFO, "setting i_size to "LPU64"\n",
+                               attr->ia_size);
+
+                        attr->ia_valid |= ATTR_SIZE;
+                        down(&inode->i_sem);
+                        fsfilt_setattr(exp->exp_obd, dchild, oti->oti_handle,
+                                       attr, 0);
+                        up(&inode->i_sem);
+                }
+        }
+
+cleanup:
+        RETURN(rc);
+}
+
+
 
 /* See if there are unallocated parts in given file region */
 static int filter_range_is_mapped(struct inode *inode, obd_size offset, int len)
@@ -100,17 +283,14 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                           struct niobuf_local *res, struct obd_trans_info *oti,
                           int rc)
 {
-        struct bio *bio = NULL;
-        int blocks_per_page, err;
         struct niobuf_local *lnb;
+        struct dio_request *dreq = NULL;
         struct lvfs_run_ctxt saved;
         struct fsfilt_objinfo fso;
         struct iattr iattr = { 0 };
         struct inode *inode = NULL;
         unsigned long now = jiffies;
-        int i, k, cleanup_phase = 0;
-
-        struct dio_request *dreq = NULL;
+        int i, err, cleanup_phase = 0;
         struct obd_device *obd = exp->exp_obd;
 
         ENTRY;
@@ -123,18 +303,10 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                 GOTO(cleanup, rc);
 
         inode = res->dentry->d_inode;
-        blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
-        LASSERT(blocks_per_page <= MAX_BLOCKS_PER_PAGE);
-
-        OBD_ALLOC(dreq, sizeof(*dreq));
-
-        if (dreq == NULL)
-                RETURN(-ENOMEM);
 
-        dreq->bio_list = NULL;
-        init_waitqueue_head(&dreq->wait);
-        atomic_set(&dreq->numreqs, 0);
-        spin_lock_init(&dreq->lock);
+        rc = filter_alloc_iobuf(OBD_BRW_WRITE, obj->ioo_bufcnt, (void **)&dreq);
+        if (rc)
+                GOTO(cleanup, rc);
 
         cleanup_phase = 1;
         fso.fso_dentry = res->dentry;
@@ -145,9 +317,8 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
 
         generic_osync_inode(inode, inode->i_mapping, OSYNC_DATA|OSYNC_METADATA);
 
-        oti->oti_handle = fsfilt_brw_start(obd, objcount, &fso,
-                                           niocount, res, oti);
-        
+        oti->oti_handle = fsfilt_brw_start(obd, objcount, &fso, niocount, res,
+                                           oti);
         if (IS_ERR(oti->oti_handle)) {
                 rc = PTR_ERR(oti->oti_handle);
                 CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
@@ -156,15 +327,14 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                 GOTO(cleanup, rc);
         }
 
+        /* have to call fsfilt_commit() from this point on */
+
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("slow brw_start %lus\n", (jiffies - now) / HZ);
 
-        iattr_from_obdo(&iattr,oa,OBD_MD_FLATIME|OBD_MD_FLMTIME|OBD_MD_FLCTIME);
+        down(&inode->i_sem);
         for (i = 0, lnb = res; i < obj->ioo_bufcnt; i++, lnb++) {
                 loff_t this_size;
-                sector_t sector;
-                struct page *pages[1];
-                int offs;
 
                 /* If overwriting an existing block, we don't need a grant */
                 if (!(lnb->flags & OBD_BRW_GRANTED) && lnb->rc == -ENOSPC &&
@@ -174,36 +344,10 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                 if (lnb->rc) /* ENOSPC, network RPC error, etc. */ 
                         continue;
 
-                /* get block number for next page */
-                pages[0] = lnb->page;
-                rc = fsfilt_map_inode_pages(obd, inode, pages, 1, 
-                                            dreq->blocks, dreq->created, 1,
-                                            NULL);
-                if (rc != 0)
-                        GOTO(cleanup, rc);
-
-                for (k = 0; k < blocks_per_page; k++) {
-                        sector = dreq->blocks[k] *(inode->i_sb->s_blocksize>>9);
-                        offs = k * inode->i_sb->s_blocksize;
-
-                        if (!bio || !can_be_merged(bio, sector) ||
-                            !bio_add_page(bio, lnb->page, PAGE_SIZE, offs)) {
-                                if (bio) {
-                                        atomic_inc(&dreq->numreqs);
-                                        submit_bio(WRITE, bio);
-                                        bio = NULL;
-                                }
-                                /* allocate new bio */
-                                bio = bio_alloc(GFP_NOIO, obj->ioo_bufcnt);
-                                bio->bi_bdev = inode->i_sb->s_bdev;
-                                bio->bi_sector = sector;
-                                bio->bi_end_io = dio_complete_routine;
-                                bio->bi_private = dreq;
-
-                                if (!bio_add_page(bio, lnb->page, PAGE_SIZE, 
-                                                  offs))
-                                        LBUG();
-                        }
+                err = filter_iobuf_add_page(obd, dreq, inode, lnb->page);
+                if (err != 0) {
+                        lnb->rc = err;
+                        continue;
                 }
 
                 /* we expect these pages to be in offset order, but we'll
@@ -213,39 +357,17 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                         iattr.ia_size = this_size;
         }
 
-        if (bio) {
-                atomic_inc(&dreq->numreqs);
-                fsfilt_send_bio(obd, inode, bio);
-        }
-
-        /* time to wait for I/O completion */
-        wait_event(dreq->wait, atomic_read(&dreq->numreqs) == 0);
-
-        /* free all bios */
-        while (dreq->bio_list) {
-                bio = dreq->bio_list;
-                dreq->bio_list = bio->bi_private;
-                bio_put(bio);
-        }
-
-        down(&inode->i_sem);
-        if (iattr.ia_size > inode->i_size) {
-                CDEBUG(D_INFO, "setting i_size to "LPU64"\n",
-                       iattr.ia_size);
-            		
-                iattr.ia_valid |= ATTR_SIZE;
-			
-                fsfilt_setattr(obd, res->dentry, oti->oti_handle,
-                               &iattr, 0);
-        }
-        up(&inode->i_sem);
+        iattr_from_obdo(&iattr,oa,OBD_MD_FLATIME|OBD_MD_FLMTIME|OBD_MD_FLCTIME);
+        rc = filter_direct_io(OBD_BRW_WRITE, res->dentry, dreq, exp, &iattr,
+                              oti, NULL);
+        rc = filter_finish_transno(exp, oti, rc);
 
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("slow direct_io %lus\n", (jiffies - now) / HZ);
 
-        rc = filter_finish_transno(exp, oti, rc);
 
-        err = fsfilt_commit(obd, inode, oti->oti_handle, obd_sync_filter);
+        err = fsfilt_commit(obd, obd->u.filter.fo_sb, inode, oti->oti_handle,
+                            obd_sync_filter);
         if (err)
                 rc = err;
 
@@ -263,14 +385,9 @@ cleanup:
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 LASSERT(current->journal_info == NULL);
         case 1:
-                OBD_FREE(dreq, sizeof(*dreq));
+                filter_free_iobuf(dreq);
         case 0:
-                for (i = 0, lnb = res; i < obj->ioo_bufcnt; i++, lnb++) {
-                        filter_release_write_page(&obd->u.filter,
-                                                  res->dentry->d_inode, lnb,
-                                                  rc);
-                }
-
+                filter_free_dio_pages(objcount, obj, niocount, res);
                 f_dput(res->dentry);
         }
 
diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c
index 599eeab66a..aa9a88b8b9 100644
--- a/lustre/obdfilter/filter_lvb.c
+++ b/lustre/obdfilter/filter_lvb.c
@@ -36,6 +36,7 @@
 
 #include "filter_internal.h"
 
+/* Called with res->lr_lvb_sem held */
 static int filter_lvbo_init(struct ldlm_resource *res)
 {
         int rc = 0;
@@ -46,13 +47,13 @@ static int filter_lvbo_init(struct ldlm_resource *res)
         ENTRY;
 
         LASSERT(res);
+        LASSERT(down_trylock(&res->lr_lvb_sem) != 0);
 
         /* we only want lvb's for object resources */
         /* check for internal locks: these have name[1] != 0 */
         if (res->lr_name.name[1])
                 RETURN(0);
 
-        down(&res->lr_lvb_sem);
         if (res->lr_lvb_data)
                 GOTO(out, rc = 0);
 
@@ -96,7 +97,6 @@ static int filter_lvbo_init(struct ldlm_resource *res)
         if (oa)
                 obdo_free(oa);
         /* Don't free lvb data on lookup error */
-        up(&res->lr_lvb_sem);
         return rc;
 }
 
diff --git a/lustre/obdfilter/lproc_obdfilter.c b/lustre/obdfilter/lproc_obdfilter.c
index 0bd3a80e91..fdbdfdef75 100644
--- a/lustre/obdfilter/lproc_obdfilter.c
+++ b/lustre/obdfilter/lproc_obdfilter.c
@@ -153,6 +153,7 @@ static struct lprocfs_vars lprocfs_obd_vars[] = {
         { "readcache_max_filesize",
                           lprocfs_filter_rd_readcache,
                           lprocfs_filter_wr_readcache, 0 },
+        { "recovery_status", lprocfs_obd_rd_recovery_status, 0, 0 },
         { 0 }
 };
 
diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c
index 078d0d184a..4ac9a774c1 100644
--- a/lustre/osc/lproc_osc.c
+++ b/lustre/osc/lproc_osc.c
@@ -128,7 +128,8 @@ int osc_wr_max_dirty_mb(struct file *file, const char *buffer,
         if (rc)
                 return rc;
 
-        if (val < 0 || val > OSC_MAX_DIRTY_MB_MAX)
+        if (val < 0 || val > OSC_MAX_DIRTY_MB_MAX ||
+            val > num_physpages >> (20 - PAGE_SHIFT - 2)) /* 1/4 of RAM */
                 return -ERANGE;
 
         spin_lock(&cli->cl_loi_list_lock);
@@ -289,6 +290,10 @@ static struct lprocfs_vars lprocfs_module_vars[] = {
 
 #define pct(a,b) (b ? a * 100 / b : 0)
 
+#define PRINTF_STIME(stime) (unsigned long)(stime)->st_num,     \
+        lprocfs_stime_avg_ms(stime), lprocfs_stime_avg_us(stime)
+
+
 static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
 {
         struct timeval now;
@@ -296,21 +301,24 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
         struct client_obd *cli = &dev->u.cli;
         unsigned long flags;
         unsigned long read_tot = 0, write_tot = 0, read_cum, write_cum;
-        int i, rpcs, r, w;
+        int i;
 
         do_gettimeofday(&now);
 
         spin_lock_irqsave(&cli->cl_loi_list_lock, flags);
 
-        rpcs = cli->cl_brw_in_flight;
-        r = cli->cl_pending_r_pages;
-        w = cli->cl_pending_w_pages;
-
         seq_printf(seq, "snapshot_time:         %lu:%lu (secs:usecs)\n",
                    now.tv_sec, now.tv_usec);
-        seq_printf(seq, "RPCs in flight:        %d\n", rpcs);
-        seq_printf(seq, "pending write pages:   %d\n", w);
-        seq_printf(seq, "pending read pages:   %d\n", r);
+
+        seq_printf(seq, "read RPCs in flight:  %d\n",
+                   cli->cl_r_in_flight);
+        seq_printf(seq, "write RPCs in flight: %d\n",
+                   cli->cl_w_in_flight);
+        seq_printf(seq, "pending write pages:  %d\n",
+                   cli->cl_pending_w_pages);
+        seq_printf(seq, "pending read pages:   %d\n",
+                   cli->cl_pending_r_pages);
+
 
         seq_printf(seq, "\n\t\t\tread\t\t\twrite\n");
         seq_printf(seq, "pages per rpc         rpcs   %% cum %% |");
@@ -358,6 +366,16 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v)
                         break;
         }
 
+        seq_printf(seq, "\nrpc service time: (rpcs, average ms)\n");
+        seq_printf(seq, "\tread\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&cli->cl_read_stime));
+        seq_printf(seq, "\twrite\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&cli->cl_write_stime));
+
+        seq_printf(seq, "app waiting: (num, average ms)\n");
+        seq_printf(seq, "\tenter cache\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&cli->cl_enter_stime));
+
         spin_unlock_irqrestore(&cli->cl_loi_list_lock, flags);
 
         return 0;
@@ -411,6 +429,10 @@ static ssize_t osc_rpc_stats_seq_write(struct file *file, const char *buf,
         lprocfs_oh_clear(&cli->cl_read_page_hist);
         lprocfs_oh_clear(&cli->cl_write_page_hist);
 
+        memset(&cli->cl_read_stime, 0, sizeof(cli->cl_read_stime));
+        memset(&cli->cl_write_stime, 0, sizeof(cli->cl_write_stime));
+        memset(&cli->cl_enter_stime, 0, sizeof(cli->cl_enter_stime));
+
         return len;
 }
 
diff --git a/lustre/osc/osc_create.c b/lustre/osc/osc_create.c
index c4048fbb46..557923bf5d 100644
--- a/lustre/osc/osc_create.c
+++ b/lustre/osc/osc_create.c
@@ -72,20 +72,22 @@ static int osc_interpret_create(struct ptlrpc_request *req, void *data,
 
         oscc = req->rq_async_args.pointer_arg[0];
         spin_lock(&oscc->oscc_lock);
+        oscc->oscc_flags &= ~OSCC_FLAG_CREATING;
         if (body)
                 oscc->oscc_last_id = body->oa.o_id;
         if (rc == -ENOSPC) {
-                DEBUG_REQ(D_INODE, req, "OST out of space, flagging");
                 oscc->oscc_flags |= OSCC_FLAG_NOSPC;
+                spin_unlock(&oscc->oscc_lock);
+                DEBUG_REQ(D_INODE, req, "OST out of space, flagging");
         } else if (rc != 0 && rc != -EIO) {
-                DEBUG_REQ(D_ERROR, req,
-                          "unknown rc %d from async create: failing oscc",
-                          rc);
                 oscc->oscc_flags |= OSCC_FLAG_RECOVERING;
+                spin_unlock(&oscc->oscc_lock);
+                DEBUG_REQ(D_ERROR, req,
+                          "unknown rc %d from async create: failing oscc", rc);
                 ptlrpc_fail_import(req->rq_import, req->rq_import_generation);
+        } else {
+                spin_unlock(&oscc->oscc_lock);
         }
-        oscc->oscc_flags &= ~OSCC_FLAG_CREATING;
-        spin_unlock(&oscc->oscc_lock);
 
         CDEBUG(D_HA, "preallocated through id "LPU64" (last used "LPU64")\n",
                oscc->oscc_last_id, oscc->oscc_next_id);
@@ -134,9 +136,9 @@ static int oscc_internal_create(struct osc_creator *oscc)
         body->oa.o_gr = oscc->oscc_gr;
         LASSERT(body->oa.o_gr > 0);
         body->oa.o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
+        spin_unlock(&oscc->oscc_lock);
         CDEBUG(D_INFO, "preallocating through id "LPU64" (last used "LPU64")\n",
                body->oa.o_id, oscc->oscc_next_id);
-        spin_unlock(&oscc->oscc_lock);
 
         request->rq_replen = lustre_msg_size(1, &size);
 
@@ -239,17 +241,21 @@ int osc_create(struct obd_export *exp, struct obdo *oa,
         if (oa->o_gr == FILTER_GROUP_LLOG || oa->o_gr == FILTER_GROUP_ECHO)
                 RETURN(osc_real_create(exp, oa, ea, oti));
 
-        lsm = *ea;
-        if (lsm == NULL) {
-                rc = obd_alloc_memmd(exp, &lsm);
-                if (rc < 0)
-                        RETURN(rc);
-        }
-
-	/* this is the special case where create removes orphans */
-	if ((oa->o_valid & OBD_MD_FLFLAGS) &&
-	    oa->o_flags == OBD_FL_DELORPHAN) {
-                CDEBUG(D_HA, "%s; oscc recovery started\n", 
+        /* this is the special case where create removes orphans */
+        if ((oa->o_valid & OBD_MD_FLFLAGS) &&
+            oa->o_flags == OBD_FL_DELORPHAN) {
+                spin_lock(&oscc->oscc_lock);
+                if (oscc->oscc_flags & OSCC_FLAG_SYNC_IN_PROGRESS) {
+                        spin_unlock(&oscc->oscc_lock);
+                        return -EBUSY;
+                }
+                if (!(oscc->oscc_flags & OSCC_FLAG_RECOVERING)) {
+                        spin_unlock(&oscc->oscc_lock);
+                        return 0;
+                }
+                oscc->oscc_flags |= OSCC_FLAG_SYNC_IN_PROGRESS;
+                spin_unlock(&oscc->oscc_lock);
+                CDEBUG(D_HA, "%s; oscc recovery started\n",
                        exp->exp_obd->obd_name);
                 LASSERT(oscc->oscc_flags & OSCC_FLAG_RECOVERING);
 
@@ -267,6 +273,7 @@ int osc_create(struct obd_export *exp, struct obdo *oa,
                 }
 
                 spin_lock(&oscc->oscc_lock);
+                oscc->oscc_flags &= ~OSCC_FLAG_SYNC_IN_PROGRESS;
                 if (rc == 0 || rc == -ENOSPC) {
                         if (rc == -ENOSPC)
                                 oscc->oscc_flags |= OSCC_FLAG_NOSPC;
@@ -283,28 +290,35 @@ int osc_create(struct obd_export *exp, struct obdo *oa,
                 }
                 spin_unlock(&oscc->oscc_lock);
 
-		RETURN(rc);
-	}
+                RETURN(rc);
+        }
+
+        lsm = *ea;
+        if (lsm == NULL) {
+                rc = obd_alloc_memmd(exp, &lsm);
+                if (rc < 0)
+                        RETURN(rc);
+        }
 
         while (try_again) {
                 /* If orphans are being recovered, then we must wait until 
                    it is finished before we can continue with create. */
                 if (oscc_recovering(oscc)) {
                         struct l_wait_info lwi;
-                        
-                        CDEBUG(D_HA,"%s: oscc sync in progress, waiting\n", 
-                               exp->exp_obd->obd_name);
-                        
-                        lwi = LWI_TIMEOUT(MAX(obd_timeout * HZ, 1), NULL, NULL);
-                        rc = l_wait_event(oscc->oscc_waitq, 
+                       
+                        CDEBUG(D_HA,"%p: oscc recovery in progress, waiting\n",
+                               oscc);
+                        lwi = LWI_TIMEOUT(MAX(obd_timeout*HZ/4, 1), NULL, NULL);
+                        rc = l_wait_event(oscc->oscc_waitq,
                                           !oscc_recovering(oscc), &lwi);
+                        
                         LASSERT(rc == 0 || rc == -ETIMEDOUT);
                         if (rc == -ETIMEDOUT) {
-                                CDEBUG(D_HA, "%s: timed out waiting for sync\n",
-                                       exp->exp_obd->obd_name);
+                                CDEBUG(D_HA,"%p: timeout waiting on recovery\n",
+                                       oscc);
                                 RETURN(rc);
                         }
-                        CDEBUG(D_HA, "%s: oscc sync over, waking up\n", 
+                        CDEBUG(D_HA, "%s: oscc recovery over, waking up\n",
                                exp->exp_obd->obd_name);
                 }
                 
@@ -330,8 +344,9 @@ int osc_create(struct obd_export *exp, struct obdo *oa,
         }
 
         if (rc == 0)
-                CDEBUG(D_INFO, "returning objid "LPU64"/"LPU64"\n",
-                                lsm->lsm_object_id, lsm->lsm_object_gr);
+                CDEBUG(D_HA, "%s: returning objid "LPU64"\n",
+                       oscc->oscc_obd->u.cli.cl_import->imp_target_uuid.uuid,
+                       lsm->lsm_object_id);
         else if (*ea == NULL)
                 obd_free_memmd(exp, &lsm);
         RETURN(rc);
diff --git a/lustre/osc/osc_internal.h b/lustre/osc/osc_internal.h
index b14d0130d0..bba36c02d9 100644
--- a/lustre/osc/osc_internal.h
+++ b/lustre/osc/osc_internal.h
@@ -47,6 +47,7 @@ struct osc_cache_waiter {
 #define OSCC_FLAG_RECOVERING 1
 #define OSCC_FLAG_CREATING   2
 #define OSCC_FLAG_NOSPC      4 /* can't create more objects on this OST */
+#define OSCC_FLAG_SYNC_IN_PROGRESS  8 /* only allow one thread to sync */
 
 int osc_create(struct obd_export *exp, struct obdo *oa,
 	       struct lov_stripe_md **ea, struct obd_trans_info *oti);
diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c
index b2172ce80f..fbd698f9ba 100644
--- a/lustre/osc/osc_request.c
+++ b/lustre/osc/osc_request.c
@@ -492,6 +492,9 @@ static int osc_destroy(struct obd_export *exp, struct obdo *oa,
         request->rq_replen = lustre_msg_size(1, &size);
 
         rc = ptlrpc_queue_wait(request);
+        
+        if (rc == -ENOENT)
+                rc = 0;
         if (rc)
                 GOTO(out, rc);
 
@@ -540,6 +543,11 @@ static void osc_consume_write_grant(struct client_obd *cli,
         LASSERT(cli->cl_avail_grant >= 0);
 }
 
+static unsigned long rpcs_in_flight(struct client_obd *cli)
+{
+        return cli->cl_r_in_flight + cli->cl_w_in_flight;
+}
+
 /* caller must hold loi_list_lock */
 void osc_wake_cache_waiters(struct client_obd *cli)
 {
@@ -556,12 +564,10 @@ void osc_wake_cache_waiters(struct client_obd *cli)
 
                 /* if still dirty cache but no grant wait for pending RPCs that
                  * may yet return us some grant before doing sync writes */
-                if (cli->cl_brw_in_flight && cli->cl_avail_grant < PAGE_SIZE) {
-                        CDEBUG(D_CACHE, "%d BRWs in flight, no grant\n",
-                               cli->cl_brw_in_flight);
-                        return;
+                if (cli->cl_w_in_flight && cli->cl_avail_grant < PAGE_SIZE) {
+                        CDEBUG(D_CACHE, "%u BRW writes in flight, no grant\n",
+                               cli->cl_w_in_flight);
                 }
-
                 ocw = list_entry(l, struct osc_cache_waiter, ocw_entry);
                 list_del_init(&ocw->ocw_entry);
                 if (cli->cl_avail_grant < PAGE_SIZE) {
@@ -602,7 +608,7 @@ static void handle_short_read(int nob_read, obd_count page_count,
 
                 if (pga->count > nob_read) {
                         /* EOF inside this page */
-                        ptr = kmap(pga->pg) + (pga->off & ~PAGE_MASK);
+                        ptr = kmap(pga->pg) + (pga->page_offset & ~PAGE_MASK);
                         memset(ptr + nob_read, 0, pga->count - nob_read);
                         kunmap(pga->pg);
                         page_count--;
@@ -617,7 +623,7 @@ static void handle_short_read(int nob_read, obd_count page_count,
 
         /* zero remaining pages */
         while (page_count-- > 0) {
-                ptr = kmap(pga->pg) + (pga->off & ~PAGE_MASK);
+                ptr = kmap(pga->pg) + (pga->page_offset & ~PAGE_MASK);
                 memset(ptr, 0, pga->count);
                 kunmap(pga->pg);
                 pga++;
@@ -674,7 +680,7 @@ static inline int can_merge_pages(struct brw_page *p1, struct brw_page *p2)
                 return 0;
         }
 
-        return (p1->off + p1->count == p2->off);
+        return (p1->disk_offset + p1->count == p2->disk_offset);
 }
 
 #if CHECKSUM_BULK
@@ -753,29 +759,32 @@ static int osc_brw_prep_request(int cmd, struct obd_import *imp,struct obdo *oa,
         ioobj->ioo_bufcnt = niocount;
 
         LASSERT (page_count > 0);
+
         for (requested_nob = i = 0; i < page_count; i++, niobuf++) {
                 struct brw_page *pg = &pga[i];
                 struct brw_page *pg_prev = pg - 1;
 
                 LASSERT(pg->count > 0);
-                LASSERT((pg->off & ~PAGE_MASK)+ pg->count <= PAGE_SIZE);
-                LASSERTF(i == 0 || pg->off > pg_prev->off,
+                LASSERTF((pg->page_offset & ~PAGE_MASK)+ pg->count <= PAGE_SIZE,
+                         "i: %d pg: %p pg_off: "LPU64", count: %u\n", i, pg,
+                         pg->page_offset, pg->count);
+                LASSERTF(i == 0 || pg->disk_offset > pg_prev->disk_offset,
                          "i %d p_c %u pg %p [pri %lu ind %lu] off "LPU64
                          " prev_pg %p [pri %lu ind %lu] off "LPU64"\n",
                          i, page_count,
-                         pg->pg, pg->pg->private, pg->pg->index, pg->off,
+                         pg->pg, pg->pg->private, pg->pg->index, pg->disk_offset,
                          pg_prev->pg, pg_prev->pg->private, pg_prev->pg->index,
-                         pg_prev->off);
+                         pg_prev->disk_offset);
 
                 ptlrpc_prep_bulk_page(desc, pg->pg,
-                                      pg->off & ~PAGE_MASK, pg->count);
+                                      pg->page_offset & ~PAGE_MASK, pg->count);
                 requested_nob += pg->count;
 
                 if (i > 0 && can_merge_pages(pg_prev, pg)) {
                         niobuf--;
                         niobuf->len += pg->count;
                 } else {
-                        niobuf->offset = pg->off;
+                        niobuf->offset = pg->disk_offset;
                         niobuf->len    = pg->count;
                         niobuf->flags  = pg->flag;
                 }
@@ -993,8 +1002,8 @@ static void sort_brw_pages(struct brw_page *array, int num)
                 for (i = stride ; i < num ; i++) {
                         tmp = array[i];
                         j = i;
-                        while (j >= stride && array[j - stride].off >
-                                tmp.off) {
+                        while (j >= stride && array[j - stride].disk_offset >
+                                tmp.disk_offset) {
                                 array[j] = array[j - stride];
                                 j -= stride;
                         }
@@ -1193,9 +1202,10 @@ static int brw_interpret_oap(struct ptlrpc_request *request,
         struct osc_async_page *oap;
         struct client_obd *cli;
         struct list_head *pos, *n;
+        struct timeval now;
         ENTRY;
 
-
+        do_gettimeofday(&now);
         rc = osc_brw_fini_request(request, aa->aa_oa, aa->aa_requested_nob,
                                   aa->aa_nio_count, aa->aa_page_count,
                                   aa->aa_pga, rc);
@@ -1215,10 +1225,22 @@ static int brw_interpret_oap(struct ptlrpc_request *request,
 
         spin_lock(&cli->cl_loi_list_lock);
 
+        if (request->rq_reqmsg->opc == OST_WRITE)
+                lprocfs_stime_record(&cli->cl_write_stime, &now,
+                                     &request->rq_rpcd_start);
+        else
+                lprocfs_stime_record(&cli->cl_read_stime, &now,
+                                     &request->rq_rpcd_start);
+
+
+
         /* We need to decrement before osc_ap_completion->osc_wake_cache_waiters
          * is called so we know whether to go to sync BRWs or wait for more
          * RPCs to complete */
-        cli->cl_brw_in_flight--;
+        if (request->rq_reqmsg->opc == OST_WRITE)
+                cli->cl_w_in_flight--;
+        else
+                cli->cl_r_in_flight--;
 
         /* the caller may re-use the oap after the completion call so
          * we need to clean it up a little */
@@ -1276,7 +1298,8 @@ static struct ptlrpc_request *osc_build_req(struct client_obd *cli,
                         ops = oap->oap_caller_ops;
                         caller_data = oap->oap_caller_data;
                 }
-                pga[i].off = oap->oap_obj_off + oap->oap_page_off;
+                pga[i].disk_offset = oap->oap_obj_off + oap->oap_page_off;
+                pga[i].page_offset = pga[i].disk_offset;
                 pga[i].pg = oap->oap_page;
                 pga[i].count = oap->oap_count;
                 pga[i].flag = oap->oap_brw_flags;
@@ -1461,17 +1484,20 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
 #ifdef __KERNEL__
         if (cmd == OBD_BRW_READ) {
                 lprocfs_oh_tally_log2(&cli->cl_read_page_hist, page_count);
-                lprocfs_oh_tally(&cli->cl_read_rpc_hist, cli->cl_brw_in_flight);
+                lprocfs_oh_tally(&cli->cl_read_rpc_hist, cli->cl_r_in_flight);
         } else {
                 lprocfs_oh_tally_log2(&cli->cl_write_page_hist, page_count);
                 lprocfs_oh_tally(&cli->cl_write_rpc_hist,
-                                 cli->cl_brw_in_flight);
+                                 cli->cl_w_in_flight);
         }
 #endif
 
         spin_lock(&cli->cl_loi_list_lock);
 
-        cli->cl_brw_in_flight++;
+        if (cmd == OBD_BRW_READ)
+                cli->cl_r_in_flight++;
+        else
+                cli->cl_w_in_flight++;
         /* queued sync pages can be torn down while the pages
          * were between the pending list and the rpc */
         list_for_each(pos, &aa->aa_oaps) {
@@ -1484,8 +1510,9 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 }
         }
 
-        CDEBUG(D_INODE, "req %p: %d pages, aa %p.  now %d in flight\n", request,
-               page_count, aa, cli->cl_brw_in_flight);
+        CDEBUG(D_INODE, "req %p: %d pages, aa %p.  now %dr/%dw in flight\n",
+                        request, page_count, aa, cli->cl_r_in_flight,
+                        cli->cl_w_in_flight);
 
         oap->oap_request = ptlrpc_request_addref(request);
         request->rq_interpret_reply = brw_interpret_oap;
@@ -1609,9 +1636,9 @@ static void osc_check_rpcs(struct client_obd *cli)
         ENTRY;
 
         while ((loi = osc_next_loi(cli)) != NULL) {
-                LOI_DEBUG(loi, "%d in flight\n", cli->cl_brw_in_flight);
-
-                if (cli->cl_brw_in_flight >= cli->cl_max_rpcs_in_flight)
+                LOI_DEBUG(loi, "%lu in flight\n", rpcs_in_flight(cli));
+                
+                if (rpcs_in_flight(cli) >= cli->cl_max_rpcs_in_flight)                        
                         break;
 
                 /* attempt some read/write balancing by alternating between
@@ -1676,7 +1703,7 @@ static int ocw_granted(struct client_obd *cli, struct osc_cache_waiter *ocw)
         int rc;
         ENTRY;
         spin_lock(&cli->cl_loi_list_lock);
-        rc = list_empty(&ocw->ocw_entry) || cli->cl_brw_in_flight == 0;
+        rc = list_empty(&ocw->ocw_entry) || rpcs_in_flight(cli) == 0;
         spin_unlock(&cli->cl_loi_list_lock);
         RETURN(rc);
 };
@@ -1688,6 +1715,7 @@ static int osc_enter_cache(struct client_obd *cli, struct lov_oinfo *loi,
 {
         struct osc_cache_waiter ocw;
         struct l_wait_info lwi = { 0 };
+        struct timeval start, stop;
 
         CDEBUG(D_CACHE, "dirty: %ld dirty_max: %ld dropped: %lu grant: %lu\n",
                cli->cl_dirty, cli->cl_dirty_max, cli->cl_lost_grant,
@@ -1707,7 +1735,7 @@ static int osc_enter_cache(struct client_obd *cli, struct lov_oinfo *loi,
         /* Make sure that there are write rpcs in flight to wait for.  This
          * is a little silly as this object may not have any pending but
          * other objects sure might. */
-        if (cli->cl_brw_in_flight) {
+        if (cli->cl_w_in_flight) {                
                 list_add_tail(&ocw.ocw_entry, &cli->cl_cache_waiters);
                 init_waitqueue_head(&ocw.ocw_waitq);
                 ocw.ocw_oap = oap;
@@ -1718,9 +1746,11 @@ static int osc_enter_cache(struct client_obd *cli, struct lov_oinfo *loi,
                 spin_unlock(&cli->cl_loi_list_lock);
 
                 CDEBUG(0, "sleeping for cache space\n");
+                do_gettimeofday(&start);
                 l_wait_event(ocw.ocw_waitq, ocw_granted(cli, &ocw), &lwi);
-
+                do_gettimeofday(&stop);
                 spin_lock(&cli->cl_loi_list_lock);
+                lprocfs_stime_record(&cli->cl_enter_stime, &stop, &start);
                 if (!list_empty(&ocw.ocw_entry)) {
                         list_del(&ocw.ocw_entry);
                         RETURN(-EINTR);
@@ -2091,9 +2121,9 @@ static int sanosc_brw_read(struct obd_export *exp, struct obdo *oa,
         for (mapped = 0; mapped < page_count; mapped++, nioptr++) {
                 LASSERT(PageLocked(pga[mapped].pg));
                 LASSERT(mapped == 0 ||
-                        pga[mapped].off > pga[mapped - 1].off);
+                        pga[mapped].disk_offset > pga[mapped - 1].disk_offset);
 
-                nioptr->offset = pga[mapped].off;
+                nioptr->offset = pga[mapped].disk_offset;
                 nioptr->len    = pga[mapped].count;
                 nioptr->flags  = pga[mapped].flag;
         }
@@ -2221,9 +2251,9 @@ static int sanosc_brw_write(struct obd_export *exp, struct obdo *oa,
         for (mapped = 0; mapped < page_count; mapped++, nioptr++) {
                 LASSERT(PageLocked(pga[mapped].pg));
                 LASSERT(mapped == 0 ||
-                        pga[mapped].off > pga[mapped - 1].off);
+                        pga[mapped].disk_offset > pga[mapped - 1].disk_offset);
 
-                nioptr->offset = pga[mapped].off;
+                nioptr->offset = pga[mapped].disk_offset;
                 nioptr->len    = pga[mapped].count;
                 nioptr->flags  = pga[mapped].flag;
         }
@@ -2336,7 +2366,11 @@ static void osc_set_data_with_check(struct lustre_handle *lockh, void *data)
 {
         struct ldlm_lock *lock = ldlm_handle2lock(lockh);
 
-        LASSERT(lock != NULL);
+        if (lock == NULL) {
+                CERROR("lockh %p, data %p - client evicted?\n", lockh, data);
+                return;
+        }
+
         l_lock(&lock->l_resource->lr_namespace->ns_lock);
 #ifdef __KERNEL__
         if (lock->l_ast_data && lock->l_ast_data != data) {
@@ -2376,6 +2410,8 @@ static int osc_enqueue(struct obd_export *exp, struct lov_stripe_md *lsm,
         struct obd_device *obd = exp->exp_obd;
         struct ldlm_res_id res_id = { .name = {0} };
         struct ost_lvb lvb;
+        struct ldlm_reply *rep;
+        struct ptlrpc_request *req = NULL;
         int rc;
         ENTRY;
 
@@ -2431,9 +2467,32 @@ static int osc_enqueue(struct obd_export *exp, struct lov_stripe_md *lsm,
         }
 
  no_match:
-        rc = ldlm_cli_enqueue(exp, NULL, obd->obd_namespace, res_id, type,
+        if (*flags & LDLM_FL_HAS_INTENT) {
+                int size[2] = {0, sizeof(struct ldlm_request)};
+
+                req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_DLM_VERSION,
+                                      LDLM_ENQUEUE, 2, size, NULL);
+                if (req == NULL)
+                        RETURN(-ENOMEM);
+
+                size[0] = sizeof(*rep);
+                size[1] = sizeof(lvb);
+                req->rq_replen = lustre_msg_size(2, size);
+        }
+        rc = ldlm_cli_enqueue(exp, req, obd->obd_namespace, res_id, type,
                               policy, mode, flags, bl_cb, cp_cb, gl_cb, data,
                               &lvb, sizeof(lvb), lustre_swab_ost_lvb, lockh);
+        if (req != NULL) {
+                if (rc == ELDLM_LOCK_ABORTED) {
+                        /* swabbed by ldlm_cli_enqueue() */
+                        LASSERT_REPSWABBED(req, 0);
+                        rep = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*rep));
+                        LASSERT(rep != NULL);
+                        if (rep->lock_policy_res1)
+                                rc = rep->lock_policy_res1;
+                }
+                ptlrpc_req_finished(req);
+        }
 
         if ((*flags & LDLM_FL_HAS_INTENT && rc == ELDLM_LOCK_ABORTED) || !rc) {
                 CDEBUG(D_INODE, "received kms == "LPU64", blocks == "LPU64"\n",
@@ -2468,7 +2527,7 @@ static int osc_match(struct obd_export *exp, struct lov_stripe_md *lsm,
         rc = ldlm_lock_match(obd->obd_namespace, *flags, &res_id, type,
                              policy, mode, lockh);
         if (rc) {
-                if (!(*flags & LDLM_FL_TEST_LOCK))
+               // if (!(*flags & LDLM_FL_TEST_LOCK))
                         osc_set_data_with_check(lockh, data);
                 RETURN(rc);
         }
@@ -2804,9 +2863,11 @@ static int osc_set_info(struct obd_export *exp, obd_count keylen,
 
         ctxt = llog_get_context(&exp->exp_obd->obd_llogs, LLOG_UNLINK_ORIG_CTXT);
         if (ctxt) {
-                rc = llog_initiator_connect(ctxt);
-                if (rc)
-                        RETURN(rc);
+                if (rc == 0)
+                        rc = llog_initiator_connect(ctxt);
+                else
+                        CERROR("cannot establish the connect for ctxt %p: %d\n",
+                               ctxt, rc);
         }
 
         imp->imp_server_timeout = 1;
@@ -2929,6 +2990,15 @@ static int osc_import_event(struct obd_device *obd,
                 break;
         }
         case IMP_EVENT_ACTIVE: {
+                /* Only do this on the MDS OSC's */
+                if (imp->imp_server_timeout) {
+                        struct osc_creator *oscc = &obd->u.cli.cl_oscc;
+
+                        spin_lock(&oscc->oscc_lock);
+                        oscc->oscc_flags &= ~OSCC_FLAG_NOSPC;
+                        spin_unlock(&oscc->oscc_lock);
+                }
+
                 if (obd->obd_observer)
                         rc = obd_notify(obd->obd_observer, obd, 1, 0);
                 break;
@@ -3004,6 +3074,8 @@ struct obd_ops osc_obd_ops = {
         .o_detach               = osc_detach,
         .o_setup                = osc_setup,
         .o_cleanup              = osc_cleanup,
+        .o_add_conn             = client_import_add_conn,
+        .o_del_conn             = client_import_del_conn,
         .o_connect              = osc_connect,
         .o_disconnect           = osc_disconnect,
         .o_statfs               = osc_statfs,
@@ -3043,6 +3115,8 @@ struct obd_ops sanosc_obd_ops = {
         .o_attach               = osc_attach,
         .o_detach               = osc_detach,
         .o_cleanup              = client_obd_cleanup,
+        .o_add_conn             = client_import_add_conn,
+        .o_del_conn             = client_import_del_conn,
         .o_connect              = osc_connect,
         .o_disconnect           = client_disconnect_export,
         .o_statfs               = osc_statfs,
diff --git a/lustre/ost/lproc_ost.c b/lustre/ost/lproc_ost.c
index 936706dcb3..9773af1d2a 100644
--- a/lustre/ost/lproc_ost.c
+++ b/lustre/ost/lproc_ost.c
@@ -23,6 +23,7 @@
 
 #include <linux/obd_class.h>
 #include <linux/lprocfs_status.h>
+#include <linux/seq_file.h>
 
 #ifndef LPROCFS
 static struct lprocfs_vars lprocfs_obd_vars[]  = { {0} };
@@ -38,5 +39,100 @@ static struct lprocfs_vars lprocfs_module_vars[] = {
         { 0 }
 };
 
+#define PRINTF_STIME(stime) (unsigned long)(stime)->st_num,     \
+        lprocfs_stime_avg_ms(stime), lprocfs_stime_avg_us(stime)
+
+static int ost_stimes_seq_show(struct seq_file *seq, void *v)
+{
+        struct timeval now;
+        struct obd_device *dev = seq->private;
+        struct ost_obd *ost = &dev->u.ost;
+
+        do_gettimeofday(&now);
+
+        spin_lock(&ost->ost_lock);
+
+        seq_printf(seq, "snapshot_time:         %lu:%lu (secs:usecs)\n",
+                   now.tv_sec, now.tv_usec);
+
+        seq_printf(seq, "\nread rpc service time: (rpcs, average ms)\n");
+        seq_printf(seq, "\tprep\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&ost->ost_stimes[0]));
+        seq_printf(seq, "\tbulk\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&ost->ost_stimes[1]));
+        seq_printf(seq, "\tcommit\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&ost->ost_stimes[2]));
+
+        seq_printf(seq, "\nwrite rpc service time: (rpcs, average ms)\n");
+        seq_printf(seq, "\tprep\t%lu\t%lu.%04lu\n",
+                        PRINTF_STIME(&ost->ost_stimes[3]));
+        seq_printf(seq, "\tbulk\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&ost->ost_stimes[4]));
+        seq_printf(seq, "\tcommit\t%lu\t%lu.%04lu\n\n",
+                        PRINTF_STIME(&ost->ost_stimes[5]));
+
+        spin_unlock(&ost->ost_lock);
+
+        return 0;
+}
+
+static void *ost_stimes_seq_start(struct seq_file *p, loff_t *pos)
+{
+        if (*pos == 0)
+                return (void *)1;
+        return NULL;
+}
+static void *ost_stimes_seq_next(struct seq_file *p, void *v, loff_t *pos)
+{
+        ++*pos;
+        return NULL;
+}
+static void ost_stimes_seq_stop(struct seq_file *p, void *v)
+{
+}
+struct seq_operations ost_stimes_seq_sops = {
+        .start = ost_stimes_seq_start,
+        .stop = ost_stimes_seq_stop,
+        .next = ost_stimes_seq_next,
+        .show = ost_stimes_seq_show,
+};
+
+static int ost_stimes_seq_open(struct inode *inode, struct file *file)
+{
+        struct proc_dir_entry *dp = PDE(inode);
+        struct seq_file *seq;
+        int rc;
+
+        rc = seq_open(file, &ost_stimes_seq_sops);
+        if (rc)
+                return rc;
+        seq = file->private_data;
+        seq->private = dp->data;
+        return 0;
+}
+
+static ssize_t ost_stimes_seq_write(struct file *file, const char *buf,
+                                       size_t len, loff_t *off)
+{
+        struct seq_file *seq = file->private_data;
+        struct obd_device *dev = seq->private;
+        struct ost_obd *ost = &dev->u.ost;
+
+        spin_lock(&ost->ost_lock);
+        memset(&ost->ost_stimes, 0, sizeof(ost->ost_stimes));
+        spin_unlock(&ost->ost_lock);
+
+        return len;
+}
+
+struct file_operations ost_stimes_fops = {
+        .owner   = THIS_MODULE,
+        .open    = ost_stimes_seq_open,
+        .read    = seq_read,
+        .write   = ost_stimes_seq_write,
+        .llseek  = seq_lseek,
+        .release = seq_release,
+};
+
 #endif /* LPROCFS */
 LPROCFS_INIT_VARS(ost, lprocfs_module_vars, lprocfs_obd_vars)
diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c
index 0ed4b806f3..2db229f485 100644
--- a/lustre/ost/ost_handler.c
+++ b/lustre/ost/ost_handler.c
@@ -354,6 +354,34 @@ obd_count ost_checksum_bulk(struct ptlrpc_bulk_desc *desc)
 }
 #endif
 
+static void ost_stime_record(struct ptlrpc_request *req, struct timeval *start,
+                             unsigned rw, unsigned phase)
+{
+        struct obd_device *obd = req->rq_svc->srv_obddev;
+        struct timeval stop;
+        int ind = rw *3 + phase;
+         
+        if (obd && obd->obd_type && obd->obd_type->typ_name) {
+                if (!strcmp(obd->obd_type->typ_name, LUSTRE_OST_NAME)) {
+                        struct ost_obd *ost = NULL;
+                        
+                        ost = &obd->u.ost;
+                        if (ind >= (sizeof(ost->ost_stimes) / 
+                                    sizeof(ost->ost_stimes[0])))
+                               return;
+                        do_gettimeofday(&stop);
+
+                        spin_lock(&ost->ost_lock);
+                        lprocfs_stime_record(&ost->ost_stimes[ind],&stop,start);
+                        spin_unlock(&ost->ost_lock);
+                        memcpy(start, &stop, sizeof(*start));
+                }
+       } 
+}
+
+static char str[PTL_NALFMT_SIZE];
+
+
 static int ost_brw_read(struct ptlrpc_request *req)
 {
         struct ptlrpc_bulk_desc *desc;
@@ -364,7 +392,6 @@ static int ost_brw_read(struct ptlrpc_request *req)
         struct ost_body         *body, *repbody;
         struct l_wait_info       lwi;
         struct obd_trans_info    oti = { 0 };
-        char                     str[PTL_NALFMT_SIZE];
         int                      size[1] = { sizeof(*body) };
         int                      comms_error = 0;
         int                      niocount;
@@ -372,6 +399,7 @@ static int ost_brw_read(struct ptlrpc_request *req)
         int                      nob = 0;
         int                      rc;
         int                      i;
+        struct timeval           start;
         ENTRY;
 
         if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_READ_BULK))
@@ -423,8 +451,10 @@ static int ost_brw_read(struct ptlrpc_request *req)
         if (desc == NULL)
                 GOTO(out_local, rc = -ENOMEM);
 
+        do_gettimeofday(&start);
         rc = obd_preprw(OBD_BRW_READ, req->rq_export, &body->oa, 1,
                         ioo, npages, pp_rnb, local_nb, &oti);
+        ost_stime_record(req, &start, 0, 0);
         if (rc != 0)
                 GOTO(out_bulk, rc);
 
@@ -481,9 +511,11 @@ static int ost_brw_read(struct ptlrpc_request *req)
                 comms_error = rc != 0;
         }
 
+        ost_stime_record(req, &start, 0, 1);
         /* Must commit after prep above in all cases */
         rc = obd_commitrw(OBD_BRW_READ, req->rq_export, &body->oa, 1,
                           ioo, npages, local_nb, &oti, rc);
+        ost_stime_record(req, &start, 0, 2);
 
         if (rc == 0) {
                 repbody = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*repbody));
@@ -548,7 +580,7 @@ int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
         int                      objcount, niocount, npages;
         int                      comms_error = 0;
         int                      rc, swab, i, j;
-        char                     str[PTL_NALFMT_SIZE];
+        struct timeval           start;        
         ENTRY;
 
         if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_WRITE_BULK))
@@ -620,8 +652,10 @@ int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
         if (desc == NULL)
                 GOTO(out_local, rc = -ENOMEM);
 
+        do_gettimeofday(&start);
         rc = obd_preprw(OBD_BRW_WRITE, req->rq_export, &body->oa, objcount,
                         ioo, npages, pp_rnb, local_nb, oti);
+        ost_stime_record(req, &start, 1, 0);
         if (rc != 0)
                 GOTO(out_bulk, rc);
 
@@ -665,27 +699,28 @@ int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
                 obd_count client_cksum = body->oa.o_cksum;
                 obd_count cksum = ost_checksum_bulk(desc);
 
-                ptlrpc_peernid2str(&req->rq_connection->c_peer, str);
                 if (client_cksum != cksum) {
-                        CERROR("Bad checksum: client %x, server %x, client NID "
-                               LPX64" (%s)\n", client_cksum, cksum,
-                               req->rq_connection->c_peer.peer_id.nid, str);
+                        CERROR("Bad checksum: client %x, server %x NID %s\n",
+                               client_cksum, cksum,
+                               ptlrpc_peernid2str(&req->rq_peer, str));
                         cksum_counter = 1;
                         repbody->oa.o_cksum = cksum;
                 } else {
                         cksum_counter++;
                         if ((cksum_counter & (-cksum_counter)) == cksum_counter)
-                                CWARN("Checksum %u from "LPX64": %x OK\n",
+                                CWARN("Checksum %u from NID %s: %x OK\n",         
                                       cksum_counter,
-                                      req->rq_connection->c_peer.peer_id.nid,
+                                      ptlrpc_peernid2str(&req->rq_peer, str),
                                       cksum);
                 }
         }
 #endif
+        ost_stime_record(req, &start, 1, 1);
         /* Must commit after prep above in all cases */
         rc = obd_commitrw(OBD_BRW_WRITE, req->rq_export, &repbody->oa,
                           objcount, ioo, npages, local_nb, oti, rc);
 
+        ost_stime_record(req, &start, 1, 2);
         if (rc == 0) {
                 repbody = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*repbody));
                 memcpy(&repbody->oa, &body->oa, sizeof(repbody->oa));
@@ -736,8 +771,8 @@ int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
                         lustre_free_reply_state (req->rq_reply_state);
                 }
                 if (req->rq_reqmsg->conn_cnt == req->rq_export->exp_conn_cnt) {
-                        CERROR("bulk IO comms error: "
-                               "evicting %s@%s nid %s\n",
+                        CERROR("%s: bulk IO comm error evicting %s@%s NID %s\n",
+                               req->rq_export->exp_obd->obd_name,
                                req->rq_export->exp_client_uuid.uuid,
                                req->rq_export->exp_connection->c_remote_uuid.uuid,
                                ptlrpc_peernid2str(&req->rq_peer, str));
@@ -1003,8 +1038,9 @@ int ost_handle(struct ptlrpc_request *req)
                 exp = req->rq_export;
 
                 if (exp == NULL) {
-                        CDEBUG(D_HA, "operation %d on unconnected OST\n",
-                               req->rq_reqmsg->opc);
+                        CDEBUG(D_HA,"operation %d on unconnected OST from %s\n",
+                               req->rq_reqmsg->opc,
+                               ptlrpc_peernid2str(&req->rq_peer, str));
                         req->rq_status = -ENOTCONN;
                         GOTO(out, rc = -ENOTCONN);
                 }
@@ -1044,12 +1080,18 @@ int ost_handle(struct ptlrpc_request *req)
                 break;
         case OST_CREATE:
                 CDEBUG(D_INODE, "create\n");
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_ENOSPC))
+                        GOTO(out, rc = -ENOSPC);
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))
+                        GOTO(out, rc = -EROFS);
                 OBD_FAIL_RETURN(OBD_FAIL_OST_CREATE_NET, 0);
                 rc = ost_create(exp, req, oti);
                 break;
         case OST_DESTROY:
                 CDEBUG(D_INODE, "destroy\n");
                 OBD_FAIL_RETURN(OBD_FAIL_OST_DESTROY_NET, 0);
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))
+                        GOTO(out, rc = -EROFS);
                 rc = ost_destroy(exp, req, oti);
                 break;
         case OST_GETATTR:
@@ -1065,6 +1107,10 @@ int ost_handle(struct ptlrpc_request *req)
         case OST_WRITE:
                 CDEBUG(D_INODE, "write\n");
                 OBD_FAIL_RETURN(OBD_FAIL_OST_BRW_NET, 0);
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_ENOSPC))
+                        GOTO(out, rc = -ENOSPC);
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))
+                        GOTO(out, rc = -EROFS);
                 rc = ost_brw_write(req, oti);
                 LASSERT(current->journal_info == NULL);
                 /* ost_brw sends its own replies */
@@ -1091,6 +1137,8 @@ int ost_handle(struct ptlrpc_request *req)
         case OST_PUNCH:
                 CDEBUG(D_INODE, "punch\n");
                 OBD_FAIL_RETURN(OBD_FAIL_OST_PUNCH_NET, 0);
+                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))
+                        GOTO(out, rc = -EROFS);
                 rc = ost_punch(exp, req, oti);
                 break;
         case OST_STATFS:
@@ -1213,6 +1261,8 @@ int ost_detach(struct obd_device *dev)
         return lprocfs_obd_detach(dev);
 }
 
+extern struct file_operations ost_stimes_fops;
+
 static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
 {
         struct ost_obd *ost = &obd->u.ost;
@@ -1227,6 +1277,9 @@ static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
         if (rc < 0)
                 RETURN(rc);
 
+        lprocfs_obd_seq_create(obd, "service_times", 0444, &ost_stimes_fops,
+                               obd);
+
         ost->ost_service =
                 ptlrpc_init_svc(OST_NBUFS, OST_BUFSIZE, OST_MAXREQSIZE,
                                 OST_REQUEST_PORTAL, OSC_REPLY_PORTAL,
@@ -1252,6 +1305,10 @@ static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
                 GOTO(out_service, rc = -ENOMEM);
         }
 
+
+        spin_lock_init(&ost->ost_lock);
+        ost->ost_service->srv_obddev = obd;
+        
         rc = ptlrpc_start_n_threads(obd, ost->ost_create_service, 1,
                                     "ll_ost_creat");
         if (rc)
diff --git a/lustre/portals/archdep.m4 b/lustre/portals/archdep.m4
index db70ec0ccb..d2bd1a142a 100644
--- a/lustre/portals/archdep.m4
+++ b/lustre/portals/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/lustre/portals/autoMakefile.am b/lustre/portals/autoMakefile.am
index bd57e6e07c..485ff04081 100644
--- a/lustre/portals/autoMakefile.am
+++ b/lustre/portals/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/lustre/portals/build.m4 b/lustre/portals/build.m4
index 93a370f736..861bb4a7f0 100644
--- a/lustre/portals/build.m4
+++ b/lustre/portals/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/lustre/portals/include/.cvsignore b/lustre/portals/include/.cvsignore
index d45f796491..94d3790678 100644
--- a/lustre/portals/include/.cvsignore
+++ b/lustre/portals/include/.cvsignore
@@ -2,3 +2,5 @@ config.h
 stamp-h
 stamp-h1
 stamp-h.in
+Makefile
+Makefile.in
diff --git a/lustre/portals/include/Makefile.am b/lustre/portals/include/Makefile.am
new file mode 100644
index 0000000000..2b3eb8cf07
--- /dev/null
+++ b/lustre/portals/include/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = linux portals
+
+EXTRA_DIST = cygwin-ioctl.h
diff --git a/lustre/portals/include/linux/Makefile.am b/lustre/portals/include/linux/Makefile.am
new file mode 100644
index 0000000000..3c28c6e833
--- /dev/null
+++ b/lustre/portals/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/lustre/portals/include/linux/kp30.h b/lustre/portals/include/linux/kp30.h
index b13f161638..db63a0812f 100644
--- a/lustre/portals/include/linux/kp30.h
+++ b/lustre/portals/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/lustre/portals/include/linux/libcfs.h b/lustre/portals/include/linux/libcfs.h
index b725a568db..d1a5c4485b 100644
--- a/lustre/portals/include/linux/libcfs.h
+++ b/lustre/portals/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/lustre/portals/include/linux/portals_compat25.h b/lustre/portals/include/linux/portals_compat25.h
index 9ab4020706..7fe6dfce5d 100644
--- a/lustre/portals/include/linux/portals_compat25.h
+++ b/lustre/portals/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/lustre/portals/include/linux/portals_lib.h b/lustre/portals/include/linux/portals_lib.h
index b4741cc281..8778a52aee 100644
--- a/lustre/portals/include/linux/portals_lib.h
+++ b/lustre/portals/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/lustre/portals/include/portals/Makefile.am b/lustre/portals/include/portals/Makefile.am
new file mode 100644
index 0000000000..4043f66361
--- /dev/null
+++ b/lustre/portals/include/portals/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/lustre/portals/include/portals/api.h b/lustre/portals/include/portals/api.h
index c7aaced559..56b7b995cb 100644
--- a/lustre/portals/include/portals/api.h
+++ b/lustre/portals/include/portals/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/lustre/portals/include/portals/defines.h b/lustre/portals/include/portals/defines.h
deleted file mode 100644
index 61aca3f438..0000000000
--- a/lustre/portals/include/portals/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/lustre/portals/include/portals/lib-types.h b/lustre/portals/include/portals/lib-types.h
index 6549988bc9..cfcef2bd57 100644
--- a/lustre/portals/include/portals/lib-types.h
+++ b/lustre/portals/include/portals/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/lustre/portals/include/portals/ppid.h b/lustre/portals/include/portals/ppid.h
deleted file mode 100644
index 760f465b88..0000000000
--- a/lustre/portals/include/portals/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/lustre/portals/include/portals/ptlctl.h b/lustre/portals/include/portals/ptlctl.h
index e0140ce748..a81a3716ac 100644
--- a/lustre/portals/include/portals/ptlctl.h
+++ b/lustre/portals/include/portals/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/lustre/portals/include/portals/types.h b/lustre/portals/include/portals/types.h
index 250b95420b..0bada40260 100644
--- a/lustre/portals/include/portals/types.h
+++ b/lustre/portals/include/portals/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/lustre/portals/knals/Makefile.in b/lustre/portals/knals/Makefile.in
index b5ed16823a..2a01119883 100644
--- a/lustre/portals/knals/Makefile.in
+++ b/lustre/portals/knals/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/lustre/portals/knals/autoMakefile.am b/lustre/portals/knals/autoMakefile.am
index 9d04a467ae..002c169480 100644
--- a/lustre/portals/knals/autoMakefile.am
+++ b/lustre/portals/knals/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/lustre/portals/knals/gmnal/gmnal.h b/lustre/portals/knals/gmnal/gmnal.h
index ca98f8435b..9c4425b10a 100644
--- a/lustre/portals/knals/gmnal/gmnal.h
+++ b/lustre/portals/knals/gmnal/gmnal.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/lustre/portals/knals/gmnal/gmnal_api.c b/lustre/portals/knals/gmnal/gmnal_api.c
index bdf5cfe6cf..bd6c83e6d9 100644
--- a/lustre/portals/knals/gmnal/gmnal_api.c
+++ b/lustre/portals/knals/gmnal/gmnal_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/lustre/portals/knals/gmnal/gmnal_cb.c b/lustre/portals/knals/gmnal/gmnal_cb.c
index e99d3ec974..0ebf43747b 100644
--- a/lustre/portals/knals/gmnal/gmnal_cb.c
+++ b/lustre/portals/knals/gmnal/gmnal_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/lustre/portals/knals/gmnal/gmnal_comm.c b/lustre/portals/knals/gmnal/gmnal_comm.c
index 4af7186c37..6a8fcbc272 100644
--- a/lustre/portals/knals/gmnal/gmnal_comm.c
+++ b/lustre/portals/knals/gmnal/gmnal_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/lustre/portals/knals/gmnal/gmnal_module.c b/lustre/portals/knals/gmnal/gmnal_module.c
index 278230e66e..3aca90f822 100644
--- a/lustre/portals/knals/gmnal/gmnal_module.c
+++ b/lustre/portals/knals/gmnal/gmnal_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/lustre/portals/knals/ibnal/.cvsignore b/lustre/portals/knals/ibnal/.cvsignore
deleted file mode 100644
index 48b17e932f..0000000000
--- a/lustre/portals/knals/ibnal/.cvsignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.deps
-Makefile
-autoMakefile.in
-autoMakefile
-*.ko
-*.mod.c
-.*.flags
-.*.cmd
-.tmp_versions
-.depend
diff --git a/lustre/portals/knals/ibnal/Makefile.in b/lustre/portals/knals/ibnal/Makefile.in
deleted file mode 100644
index e180b3e220..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/autoMakefile.am b/lustre/portals/knals/ibnal/autoMakefile.am
deleted file mode 100644
index ffe084c92d..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/ibnal.c b/lustre/portals/knals/ibnal/ibnal.c
deleted file mode 100644
index c6bd7ed044..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/ibnal.h b/lustre/portals/knals/ibnal/ibnal.h
deleted file mode 100644
index 4a1f0d7cf3..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/ibnal_cb.c b/lustre/portals/knals/ibnal/ibnal_cb.c
deleted file mode 100644
index f359441826..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/ibnal_send_recv_self_testing.c b/lustre/portals/knals/ibnal/ibnal_send_recv_self_testing.c
deleted file mode 100644
index 82defdba87..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/ibnal/uagent.c b/lustre/portals/knals/ibnal/uagent.c
deleted file mode 100644
index d7e939ae97..0000000000
--- a/lustre/portals/knals/ibnal/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/lustre/portals/knals/openibnal/Makefile.in b/lustre/portals/knals/openibnal/Makefile.in
new file mode 100644
index 0000000000..9b8ed5d1c8
--- /dev/null
+++ b/lustre/portals/knals/openibnal/Makefile.in
@@ -0,0 +1,6 @@
+MODULES := kopenibnal
+kopenibnal-objs := openibnal.o openibnal_cb.o
+
+EXTRA_POST_CFLAGS := @OPENIBCPPFLAGS@
+
+@INCLUDE_RULES@
diff --git a/lustre/portals/knals/openibnal/Makefile.mk b/lustre/portals/knals/openibnal/Makefile.mk
new file mode 100644
index 0000000000..bd8043e53c
--- /dev/null
+++ b/lustre/portals/knals/openibnal/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/lustre/portals/knals/openibnal/autoMakefile.am b/lustre/portals/knals/openibnal/autoMakefile.am
new file mode 100644
index 0000000000..a4207ae080
--- /dev/null
+++ b/lustre/portals/knals/openibnal/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/lustre/portals/knals/openibnal/openibnal.c b/lustre/portals/knals/openibnal/openibnal.c
new file mode 100644
index 0000000000..6f661431ae
--- /dev/null
+++ b/lustre/portals/knals/openibnal/openibnal.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 (&params.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, &params.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, &params,
+                                        &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/lustre/portals/knals/openibnal/openibnal.h b/lustre/portals/knals/openibnal/openibnal.h
new file mode 100644
index 0000000000..301d3ae051
--- /dev/null
+++ b/lustre/portals/knals/openibnal/openibnal.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/lustre/portals/knals/openibnal/openibnal_cb.c b/lustre/portals/knals/openibnal/openibnal_cb.c
new file mode 100644
index 0000000000..79bf37ae34
--- /dev/null
+++ b/lustre/portals/knals/openibnal/openibnal_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/lustre/portals/knals/qswnal/qswnal.c b/lustre/portals/knals/qswnal/qswnal.c
index 38d1636166..16123c21f2 100644
--- a/lustre/portals/knals/qswnal/qswnal.c
+++ b/lustre/portals/knals/qswnal/qswnal.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/lustre/portals/knals/qswnal/qswnal.h b/lustre/portals/knals/qswnal/qswnal.h
index b085caae96..438edc682f 100644
--- a/lustre/portals/knals/qswnal/qswnal.h
+++ b/lustre/portals/knals/qswnal/qswnal.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/lustre/portals/knals/qswnal/qswnal_cb.c b/lustre/portals/knals/qswnal/qswnal_cb.c
index e1237a8647..97b5a268f9 100644
--- a/lustre/portals/knals/qswnal/qswnal_cb.c
+++ b/lustre/portals/knals/qswnal/qswnal_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/lustre/portals/knals/socknal/socknal.c b/lustre/portals/knals/socknal/socknal.c
index 3a3629b873..2a0ef11847 100644
--- a/lustre/portals/knals/socknal/socknal.c
+++ b/lustre/portals/knals/socknal/socknal.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/lustre/portals/knals/socknal/socknal.h b/lustre/portals/knals/socknal/socknal.h
index e14205951e..0a5266a64f 100644
--- a/lustre/portals/knals/socknal/socknal.h
+++ b/lustre/portals/knals/socknal/socknal.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/lustre/portals/knals/socknal/socknal_cb.c b/lustre/portals/knals/socknal/socknal_cb.c
index 5815d16f0b..b22d501ed9 100644
--- a/lustre/portals/knals/socknal/socknal_cb.c
+++ b/lustre/portals/knals/socknal/socknal_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/lustre/portals/libcfs/Makefile.in b/lustre/portals/libcfs/Makefile.in
index 6f9c98148d..0967123ce9 100644
--- a/lustre/portals/libcfs/Makefile.in
+++ b/lustre/portals/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/lustre/portals/libcfs/Makefile.mk b/lustre/portals/libcfs/Makefile.mk
index c2014296df..8ecf3c9387 100644
--- a/lustre/portals/libcfs/Makefile.mk
+++ b/lustre/portals/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/lustre/portals/libcfs/autoMakefile.am b/lustre/portals/libcfs/autoMakefile.am
index 192c3efaf1..9c27693325 100644
--- a/lustre/portals/libcfs/autoMakefile.am
+++ b/lustre/portals/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/lustre/portals/libcfs/debug.c b/lustre/portals/libcfs/debug.c
index eb75e60442..c56f76ff39 100644
--- a/lustre/portals/libcfs/debug.c
+++ b/lustre/portals/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/lustre/portals/libcfs/lwt.c b/lustre/portals/libcfs/lwt.c
index a24423e867..3f6a9c27fa 100644
--- a/lustre/portals/libcfs/lwt.c
+++ b/lustre/portals/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/lustre/portals/libcfs/module.c b/lustre/portals/libcfs/module.c
index 06f1578fb9..3703013d1b 100644
--- a/lustre/portals/libcfs/module.c
+++ b/lustre/portals/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/lustre/portals/libcfs/proc.c b/lustre/portals/libcfs/proc.c
index c850f690fd..aa9cfa85a2 100644
--- a/lustre/portals/libcfs/proc.c
+++ b/lustre/portals/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/lustre/portals/libcfs/tracefile.c b/lustre/portals/libcfs/tracefile.c
new file mode 100644
index 0000000000..562abcfb7e
--- /dev/null
+++ b/lustre/portals/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/lustre/portals/libcfs/tracefile.h b/lustre/portals/libcfs/tracefile.h
new file mode 100644
index 0000000000..1b6e7a05e1
--- /dev/null
+++ b/lustre/portals/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/lustre/portals/portals/api-ni.c b/lustre/portals/portals/api-ni.c
index 56afd451a5..72d3b4188e 100644
--- a/lustre/portals/portals/api-ni.c
+++ b/lustre/portals/portals/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/lustre/portals/portals/api-wrap.c b/lustre/portals/portals/api-wrap.c
index d7ff0203ea..37f6c0b2c6 100644
--- a/lustre/portals/portals/api-wrap.c
+++ b/lustre/portals/portals/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/lustre/portals/portals/lib-md.c b/lustre/portals/portals/lib-md.c
index a4df791787..6deadb8442 100644
--- a/lustre/portals/portals/lib-md.c
+++ b/lustre/portals/portals/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/lustre/portals/portals/lib-move.c b/lustre/portals/portals/lib-move.c
index 854a452e55..13451d93e5 100644
--- a/lustre/portals/portals/lib-move.c
+++ b/lustre/portals/portals/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/lustre/portals/portals/lib-msg.c b/lustre/portals/portals/lib-msg.c
index 328b8d8a7d..54e89bcf40 100644
--- a/lustre/portals/portals/lib-msg.c
+++ b/lustre/portals/portals/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/lustre/portals/router/proc.c b/lustre/portals/router/proc.c
index dd65b34b6d..0fe3b90511 100644
--- a/lustre/portals/router/proc.c
+++ b/lustre/portals/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/lustre/portals/router/router.c b/lustre/portals/router/router.c
index 9fb6afef4c..448ab1f588 100644
--- a/lustre/portals/router/router.c
+++ b/lustre/portals/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/lustre/portals/router/router.h b/lustre/portals/router/router.h
index 0787064c50..27e49837a2 100644
--- a/lustre/portals/router/router.h
+++ b/lustre/portals/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/lustre/portals/tests/ping_cli.c b/lustre/portals/tests/ping_cli.c
index b216df16c5..7a3f8a0809 100644
--- a/lustre/portals/tests/ping_cli.c
+++ b/lustre/portals/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/lustre/portals/tests/ping_srv.c b/lustre/portals/tests/ping_srv.c
index 188ba98985..dec806ac1e 100644
--- a/lustre/portals/tests/ping_srv.c
+++ b/lustre/portals/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/lustre/portals/tests/sping_cli.c b/lustre/portals/tests/sping_cli.c
index 8e8649195d..730ba00392 100644
--- a/lustre/portals/tests/sping_cli.c
+++ b/lustre/portals/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/lustre/portals/tests/sping_srv.c b/lustre/portals/tests/sping_srv.c
index d840ddd928..f2382d1066 100644
--- a/lustre/portals/tests/sping_srv.c
+++ b/lustre/portals/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/lustre/portals/unals/Makefile.am b/lustre/portals/unals/Makefile.am
index 1681250fca..3437d3922f 100644
--- a/lustre/portals/unals/Makefile.am
+++ b/lustre/portals/unals/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/lustre/portals/unals/connection.c b/lustre/portals/unals/connection.c
index 3448460cfa..ed8dc08758 100644
--- a/lustre/portals/unals/connection.c
+++ b/lustre/portals/unals/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/lustre/portals/utils/Makefile.am b/lustre/portals/utils/Makefile.am
index a14df1c27c..1d9f9050a9 100644
--- a/lustre/portals/utils/Makefile.am
+++ b/lustre/portals/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/lustre/portals/utils/acceptor.c b/lustre/portals/utils/acceptor.c
index f6367d499f..8aea457083 100644
--- a/lustre/portals/utils/acceptor.c
+++ b/lustre/portals/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/lustre/portals/utils/debug.c b/lustre/portals/utils/debug.c
index 9ce7528887..36d8a04398 100644
--- a/lustre/portals/utils/debug.c
+++ b/lustre/portals/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/lustre/portals/utils/debugctl.c b/lustre/portals/utils/debugctl.c
index 02cb9b4fec..1b6cd96f4f 100644
--- a/lustre/portals/utils/debugctl.c
+++ b/lustre/portals/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/lustre/portals/utils/portals.c b/lustre/portals/utils/portals.c
index f8107d8068..1bde59f50d 100644
--- a/lustre/portals/utils/portals.c
+++ b/lustre/portals/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/lustre/portals/utils/ptlctl.c b/lustre/portals/utils/ptlctl.c
index c65ecb2443..03cfe777b2 100644
--- a/lustre/portals/utils/ptlctl.c
+++ b/lustre/portals/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/ptlrpc/Makefile.in b/lustre/ptlrpc/Makefile.in
index 6b27d3e715..2141a43c40 100644
--- a/lustre/ptlrpc/Makefile.in
+++ b/lustre/ptlrpc/Makefile.in
@@ -4,16 +4,17 @@ LDLM := @top_srcdir@/ldlm/
 else
 LDLM :=
 endif
-ptlrpc-objs := $(LDLM)l_lock.o $(LDLM)ldlm_lock.o 
-ptlrpc-objs += $(LDLM)ldlm_resource.o $(LDLM)ldlm_lib.o
-ptlrpc-objs += $(LDLM)ldlm_plain.o $(LDLM)ldlm_extent.o
-ptlrpc-objs += $(LDLM)ldlm_request.o $(LDLM)ldlm_lockd.o
-ptlrpc-objs += $(LDLM)ldlm_flock.o $(LDLM)ldlm_inodebits.o
-ptlrpc-objs += client.o recover.o connection.o niobuf.o pack_generic.o
-ptlrpc-objs += events.o ptlrpc_module.o service.o pinger.o recov_thread.o
-ptlrpc-objs += llog_net.o llog_client.o llog_server.o import.o ptlrpcd.o
-ptlrpc-objs += pers.o lproc_ptlrpc.o
+ldlm_objs := $(LDLM)l_lock.o $(LDLM)ldlm_lock.o 
+ldlm_objs += $(LDLM)ldlm_resource.o $(LDLM)ldlm_lib.o
+ldlm_objs += $(LDLM)ldlm_plain.o $(LDLM)ldlm_extent.o
+ldlm_objs += $(LDLM)ldlm_request.o $(LDLM)ldlm_lockd.o
+ldlm_objs += $(LDLM)ldlm_flock.o $(LDLM)ldlm_inodebits.o
+ptlrpc_objs := client.o recover.o connection.o niobuf.o pack_generic.o
+ptlrpc_objs += events.o ptlrpc_module.o service.o pinger.o recov_thread.o
+ptlrpc_objs += llog_net.o llog_client.o llog_server.o import.o ptlrpcd.o
+ptlrpc_objs += pers.o lproc_ptlrpc.o
 
+ptlrpc-objs := $(ldlm_objs) $(ptlrpc_objs)
 default: all
 
 ldlm_%.c: @LUSTRE@/ldlm/ldlm_%.c
diff --git a/lustre/ptlrpc/autoMakefile.am b/lustre/ptlrpc/autoMakefile.am
index 96dcfe36c6..6e354df9dc 100644
--- a/lustre/ptlrpc/autoMakefile.am
+++ b/lustre/ptlrpc/autoMakefile.am
@@ -28,5 +28,5 @@ modulefs_DATA = ptlrpc$(KMODEXT)
 endif # MODULES
 
 MOSTLYCLEANFILES = *.o *.ko *.mod.c ldlm_*.c l_lock.c
-DIST_SOURCES = $(filter-out @top_srcdir@/ldlm/%,$(ptlrpc-objs:%.o=%.c)) ptlrpc_internal.h
 
+DIST_SOURCES = $(ptlrpc_objs:.o=.c) ptlrpc_internal.h
diff --git a/lustre/ptlrpc/client.c b/lustre/ptlrpc/client.c
index 678934d326..38b46a8365 100644
--- a/lustre/ptlrpc/client.c
+++ b/lustre/ptlrpc/client.c
@@ -502,6 +502,7 @@ static int after_reply(struct ptlrpc_request *req)
         /* Store transno in reqmsg for replay. */
         req->rq_reqmsg->transno = req->rq_transno = req->rq_repmsg->transno;
 
+
         if (req->rq_import->imp_replayable) {
                 spin_lock_irqsave(&imp->imp_lock, flags);
                 if (req->rq_replay || req->rq_transno != 0)
@@ -825,7 +826,7 @@ int ptlrpc_expire_one_request(struct ptlrpc_request *req)
         if (replied)
                 RETURN(0);
 
-        DEBUG_REQ(D_ERROR, req, "timeout");
+        DEBUG_REQ(D_ERROR, req, "timeout (sent at %lu)", (long)req->rq_sent); 
 
         ptlrpc_unregister_reply (req);
 
@@ -987,7 +988,7 @@ int ptlrpc_set_wait(struct ptlrpc_request_set *set)
                  * EINTR.
                  * I don't really care if we go once more round the loop in
                  * the error cases -eeb. */
-        } while (rc != 0);
+        } while (rc != 0 || set->set_remaining != 0);
 
         LASSERT(set->set_remaining == 0);
 
@@ -1126,7 +1127,7 @@ void ptlrpc_unregister_reply (struct ptlrpc_request *request)
         /* We have to l_wait_event() whatever the result, to give liblustre
          * a chance to run reply_in_callback() */
 
-        if (request->rq_set == NULL)
+        if (request->rq_set != NULL)
                 wq = &request->rq_set->set_waitq;
         else
                 wq = &request->rq_reply_waitq;
@@ -1276,15 +1277,13 @@ void ptlrpc_retain_replayable_request(struct ptlrpc_request *req,
 
         /* clear this  for new requests that were resent as well
            as resent replayed requests. */
-        lustre_msg_clear_flags(req->rq_reqmsg,
-                             MSG_RESENT);
+        lustre_msg_clear_flags(req->rq_reqmsg, MSG_RESENT);
 
         /* don't re-add requests that have been replayed */
         if (!list_empty(&req->rq_replay_list))
                 return;
 
-        lustre_msg_add_flags(req->rq_reqmsg,
-                             MSG_REPLAY);
+        lustre_msg_add_flags(req->rq_reqmsg, MSG_REPLAY);
 
         LASSERT(imp->imp_replayable);
         /* Balanced in ptlrpc_free_committed, usually. */
@@ -1413,7 +1412,7 @@ restart:
                 timeout = 1;
         } else {
                 timeout = MAX(req->rq_timeout * HZ, 1);
-                DEBUG_REQ(D_NET, req, "-- sleeping");
+                DEBUG_REQ(D_NET, req, "-- sleeping for %d jiffies", timeout);
         }
         lwi = LWI_TIMEOUT_INTR(timeout, expired_request, interrupted_request,
                                req);
diff --git a/lustre/ptlrpc/events.c b/lustre/ptlrpc/events.c
index 8ea1813f70..aae2bece41 100644
--- a/lustre/ptlrpc/events.c
+++ b/lustre/ptlrpc/events.c
@@ -45,7 +45,7 @@ int               ptlrpc_ninterfaces;
  */
 void request_out_callback(ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id   *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id   *cbid = ev->md.user_ptr;
         struct ptlrpc_request *req = cbid->cbid_arg;
         unsigned long          flags;
         ENTRY;
@@ -80,7 +80,7 @@ void request_out_callback(ptl_event_t *ev)
  */
 void reply_in_callback(ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id   *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id   *cbid = ev->md.user_ptr;
         struct ptlrpc_request *req = cbid->cbid_arg;
         unsigned long flags;
         ENTRY;
@@ -88,7 +88,7 @@ void reply_in_callback(ptl_event_t *ev)
         LASSERT (ev->type == PTL_EVENT_PUT_END ||
                  ev->type == PTL_EVENT_UNLINK);
         LASSERT (ev->unlinked);
-        LASSERT (ev->mem_desc.start == req->rq_repmsg);
+        LASSERT (ev->md.start == req->rq_repmsg);
         LASSERT (ev->offset == 0);
         LASSERT (ev->mlength <= req->rq_replen);
         
@@ -119,7 +119,7 @@ void reply_in_callback(ptl_event_t *ev)
  */
 void client_bulk_callback (ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id     *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id     *cbid = ev->md.user_ptr;
         struct ptlrpc_bulk_desc *desc = cbid->cbid_arg;
         unsigned long            flags;
         ENTRY;
@@ -159,7 +159,7 @@ void client_bulk_callback (ptl_event_t *ev)
  */
 void request_in_callback(ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id               *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id               *cbid = ev->md.user_ptr;
         struct ptlrpc_request_buffer_desc *rqbd = cbid->cbid_arg;
         struct ptlrpc_srv_ni              *srv_ni = rqbd->rqbd_srv_ni;
         struct ptlrpc_service             *service = srv_ni->sni_service;
@@ -170,8 +170,8 @@ void request_in_callback(ptl_event_t *ev)
 
         LASSERT (ev->type == PTL_EVENT_PUT_END ||
                  ev->type == PTL_EVENT_UNLINK);
-        LASSERT ((char *)ev->mem_desc.start >= rqbd->rqbd_buffer);
-        LASSERT ((char *)ev->mem_desc.start + ev->offset + ev->mlength <=
+        LASSERT ((char *)ev->md.start >= rqbd->rqbd_buffer);
+        LASSERT ((char *)ev->md.start + ev->offset + ev->mlength <=
                  rqbd->rqbd_buffer + service->srv_buf_size);
 
         CDEBUG((ev->ni_fail_type == PTL_OK) ? D_NET : D_ERROR,
@@ -207,7 +207,7 @@ void request_in_callback(ptl_event_t *ev)
          * flags are reset and scalars are zero.  We only set the message
          * size to non-zero if this was a successful receive. */
         req->rq_xid = ev->match_bits;
-        req->rq_reqmsg = ev->mem_desc.start + ev->offset;
+        req->rq_reqmsg = ev->md.start + ev->offset;
         if (ev->type == PTL_EVENT_PUT_END &&
             ev->ni_fail_type == PTL_NI_OK)
                 req->rq_reqlen = ev->mlength;
@@ -252,7 +252,7 @@ void request_in_callback(ptl_event_t *ev)
  */
 void reply_out_callback(ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id       *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id       *cbid = ev->md.user_ptr;
         struct ptlrpc_reply_state *rs = cbid->cbid_arg;
         struct ptlrpc_srv_ni      *sni = rs->rs_srv_ni;
         struct ptlrpc_service     *svc = sni->sni_service;
@@ -290,7 +290,7 @@ void reply_out_callback(ptl_event_t *ev)
  */
 void server_bulk_callback (ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id     *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id     *cbid = ev->md.user_ptr;
         struct ptlrpc_bulk_desc *desc = cbid->cbid_arg;
         unsigned long            flags;
         ENTRY;
@@ -330,7 +330,7 @@ void server_bulk_callback (ptl_event_t *ev)
 
 static void ptlrpc_master_callback(ptl_event_t *ev)
 {
-        struct ptlrpc_cb_id *cbid = ev->mem_desc.user_ptr;
+        struct ptlrpc_cb_id *cbid = ev->md.user_ptr;
         void (*callback)(ptl_event_t *ev) = cbid->cbid_fn;
 
         /* Honestly, it's best to find out early. */
@@ -619,7 +619,7 @@ int ptlrpc_init_portals(void)
                 {QSWNAL,  "qswnal"},
                 {SOCKNAL, "socknal"},
                 {GMNAL,   "gmnal"},
-                {IBNAL,   "ibnal"},
+                {OPENIBNAL,   "openibnal"},
                 {TCPNAL,  "tcpnal"},
 #else
                 {CRAY_KB_ERNAL, "cray_kb_ernal"},
diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c
index 5fdf81297c..24806f190c 100644
--- a/lustre/ptlrpc/import.c
+++ b/lustre/ptlrpc/import.c
@@ -101,7 +101,7 @@ int ptlrpc_set_import_discon(struct obd_import *imp)
 
         if (imp->imp_state == LUSTRE_IMP_FULL) {
                 CERROR("%s: connection lost to %s@%s\n",
-                       imp->imp_obd->obd_name, 
+                       imp->imp_obd->obd_name,
                        imp->imp_target_uuid.uuid,
                        imp->imp_connection->c_remote_uuid.uuid);
                 IMPORT_SET_STATE_NOLOCK(imp, LUSTRE_IMP_DISCON);
@@ -226,6 +226,76 @@ void ptlrpc_fail_import(struct obd_import *imp, int generation)
         EXIT;
 }
 
+#define ATTEMPT_TOO_SOON(last)  \
+        ((last) && ((long)(jiffies - (last)) <= (long)(obd_timeout * 2 * HZ)))
+
+static int import_select_connection(struct obd_import *imp)
+{
+        struct obd_import_conn *imp_conn, *tmp;
+        struct obd_export *dlmexp;
+        int found = 0;
+        ENTRY;
+
+        spin_lock(&imp->imp_lock);
+
+        if (list_empty(&imp->imp_conn_list)) {
+                CERROR("no available connections on imp %p@%s\n",
+                        imp, imp->imp_obd->obd_name);
+                spin_unlock(&imp->imp_lock);
+                RETURN(-EINVAL);
+        }
+
+        list_for_each_entry(imp_conn, &imp->imp_conn_list, oic_item) {
+                if (!ATTEMPT_TOO_SOON(imp_conn->oic_last_attempt)) {
+                        found = 1;
+                        break;
+                }
+        }
+
+        /* if not found, simply choose the current one */
+        if (!found) {
+                CWARN("obd %s imp 0x%p: all connections have been "
+                      "tried recently\n", imp->imp_obd->obd_name, imp);
+                LASSERT(imp->imp_conn_current);
+                imp_conn = imp->imp_conn_current;
+        }
+        LASSERT(imp_conn->oic_conn);
+
+        imp_conn->oic_last_attempt = jiffies;
+
+        /* move the items ahead of the selected one to list tail */
+        while (1) {
+                tmp= list_entry(imp->imp_conn_list.next,
+                                struct obd_import_conn, oic_item);
+                if (tmp == imp_conn)
+                        break;
+                list_del(&tmp->oic_item);
+                list_add_tail(&tmp->oic_item, &imp->imp_conn_list);
+        }
+
+        /* switch connection, don't mind if it's same as the current one */
+        if (imp->imp_connection)
+                ptlrpc_put_connection(imp->imp_connection);
+        imp->imp_connection = ptlrpc_connection_addref(imp_conn->oic_conn);
+
+        dlmexp =  class_conn2export(&imp->imp_dlm_handle);
+        LASSERT(dlmexp != NULL);
+        if (dlmexp->exp_connection)
+                ptlrpc_put_connection(imp->imp_connection);
+        dlmexp->exp_connection = ptlrpc_connection_addref(imp_conn->oic_conn);
+        class_export_put(dlmexp);
+
+        imp->imp_conn_current = imp_conn;
+        CWARN("obd %s imp 0x%p: select conn %s\n",
+               imp->imp_obd->obd_name, imp,
+               imp_conn->oic_uuid.uuid);
+        spin_unlock(&imp->imp_lock);
+
+        RETURN(0);
+}
+
+
+
 int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid)
 {
         struct obd_device *obd = imp->imp_obd;
@@ -274,39 +344,17 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid)
         spin_unlock_irqrestore(&imp->imp_lock, flags);
 
         if (new_uuid) {
-                struct ptlrpc_connection *conn;
                 struct obd_uuid uuid;
-                struct obd_export *dlmexp;
 
                 obd_str2uuid(&uuid, new_uuid);
 
-                conn = ptlrpc_uuid_to_connection(&uuid);
-                if (!conn)
-                        GOTO(out, rc = -ENOENT);
-
-                CDEBUG(D_HA, "switching import %s/%s from %s to %s\n",
-                       imp->imp_target_uuid.uuid, imp->imp_obd->obd_name,
-                       imp->imp_connection->c_remote_uuid.uuid,
-                       conn->c_remote_uuid.uuid);
-
-                /* Switch the import's connection and the DLM export's
-                 * connection (which are almost certainly the same, but we
-                 * keep distinct refs just to make things clearer. I think. */
-                if (imp->imp_connection)
-                        ptlrpc_put_connection(imp->imp_connection);
-                /* We hand off the ref from ptlrpc_get_connection. */
-                imp->imp_connection = conn;
-
-                dlmexp = class_conn2export(&imp->imp_dlm_handle);
-
-                LASSERT(dlmexp != NULL);
-
-                if (dlmexp->exp_connection)
-                        ptlrpc_put_connection(dlmexp->exp_connection);
-                dlmexp->exp_connection = ptlrpc_connection_addref(conn);
-                class_export_put(dlmexp);
-
+                rc = import_set_conn_priority(imp, &uuid);
+                if (rc)
+                        GOTO(out, rc);
         }
+        rc = import_select_connection(imp);
+        if (rc)
+                GOTO(out, rc);
 
         request = ptlrpc_prep_req(imp, LUSTRE_OBD_VERSION,
                                   imp->imp_connect_op, 4, size, tmp);
@@ -364,6 +412,8 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request,
 
         if (rc)
                 GOTO(out, rc);
+        LASSERT(imp->imp_conn_current);
+        imp->imp_conn_current->oic_last_attempt = 0;
 
         msg_flags = lustre_msg_get_op_flags(request->rq_repmsg);
 
@@ -463,17 +513,10 @@ finish:
  out:
         if (rc != 0) {
                 IMPORT_SET_STATE(imp, LUSTRE_IMP_DISCON);
-                if (aa->pcaa_initial_connect && !imp->imp_initial_recov) {
+                if (aa->pcaa_initial_connect && !imp->imp_initial_recov)
                         ptlrpc_deactivate_import(imp);
-                }
-                if (rc == -ETIMEDOUT && (jiffies - imp->imp_connect_start) > HZ) {
-                        CDEBUG(D_ERROR, "recovery of %s on %s failed (timeout)\n",
-                               imp->imp_target_uuid.uuid,
-                               (char *)imp->imp_connection->c_remote_uuid.uuid);
-                        ptlrpc_connect_import(imp, NULL);
-                        RETURN(0);
-                }
-                CDEBUG(D_ERROR, "recovery of %s on %s failed (%d)\n",
+
+                CDEBUG(D_HA, "recovery of %s on %s failed (%d)\n",
                        imp->imp_target_uuid.uuid,
                        (char *)imp->imp_connection->c_remote_uuid.uuid, rc);
         }
diff --git a/lustre/ptlrpc/llog_server.c b/lustre/ptlrpc/llog_server.c
index 8d40bc96be..6c81fa78b9 100644
--- a/lustre/ptlrpc/llog_server.c
+++ b/lustre/ptlrpc/llog_server.c
@@ -75,7 +75,9 @@ int llog_origin_handle_open(struct ptlrpc_request *req)
         }
 
         ctxt = llog_get_context(&obd->obd_llogs, body->lgd_ctxt_idx);
-        LASSERT(ctxt != NULL);
+        if (ctxt == NULL)
+                GOTO(out, rc = -EINVAL);
+
         push_ctxt(&saved, ctxt->loc_lvfs_ctxt, NULL);
 
         rc = llog_open(ctxt, &loghandle, logid, name, body->lgd_llh_flags);
@@ -125,7 +127,8 @@ int llog_origin_handle_prev_block(struct ptlrpc_request *req)
                 GOTO(out, rc = -ENOMEM);
 
         ctxt = llog_get_context(&obd->obd_llogs, body->lgd_ctxt_idx);
-        LASSERT(ctxt != NULL);
+        if (ctxt == NULL)
+                GOTO(out, rc = -EINVAL);
         push_ctxt(&saved, ctxt->loc_lvfs_ctxt, NULL);
 
         rc = llog_open(ctxt, &loghandle, &body->lgd_logid, NULL, 0);
@@ -193,7 +196,8 @@ int llog_origin_handle_next_block(struct ptlrpc_request *req)
                 GOTO(out, rc = -ENOMEM);
 
         ctxt = llog_get_context(&obd->obd_llogs, body->lgd_ctxt_idx);
-        LASSERT(ctxt != NULL);
+        if (ctxt == NULL)
+                GOTO(out, rc = -EINVAL);
         push_ctxt(&saved, ctxt->loc_lvfs_ctxt, NULL);
 
         rc = llog_open(ctxt, &loghandle, &body->lgd_logid, NULL, 0);
@@ -257,7 +261,8 @@ int llog_origin_handle_read_header(struct ptlrpc_request *req)
         }
 
         ctxt = llog_get_context(&obd->obd_llogs, body->lgd_ctxt_idx);
-        LASSERT(ctxt != NULL);
+        if (ctxt == NULL)
+                GOTO(out, rc = -EINVAL);
         push_ctxt(&saved, ctxt->loc_lvfs_ctxt, NULL);
 
         rc = llog_open(ctxt, &loghandle, &body->lgd_logid, NULL, 0);
diff --git a/lustre/ptlrpc/lproc_ptlrpc.c b/lustre/ptlrpc/lproc_ptlrpc.c
index 0075860989..7054f993d3 100644
--- a/lustre/ptlrpc/lproc_ptlrpc.c
+++ b/lustre/ptlrpc/lproc_ptlrpc.c
@@ -52,7 +52,7 @@ struct ll_rpc_opcode {
         { OST_SYNC,         "ost_sync" },
         { OST_SET_INFO,     "ost_set_info" },
         { MDS_GETATTR,      "mds_getattr" },
-        { MDS_GETATTR_NAME, "mds_getattr_name" },
+        { MDS_GETATTR_LOCK, "mds_getattr_lock" },
         { MDS_CLOSE,        "mds_close" },
         { MDS_REINT,        "mds_reint" },
         { MDS_READPAGE,     "mds_readpage" },
@@ -134,6 +134,9 @@ void ptlrpc_lprocfs_register(struct proc_dir_entry *root, char *dir,
                              svc_counter_config, "req_qdepth", "reqs");
         lprocfs_counter_init(svc_stats, PTLRPC_REQACTIVE_CNTR,
                              svc_counter_config, "req_active", "reqs");
+        lprocfs_counter_init(svc_stats, PTLRPC_REQBUF_AVAIL_CNTR,
+                             svc_counter_config, "reqbuf_avail", "bufs");
+
         for (i = 0; i < LUSTRE_MAX_OPCODES; i++) {
                 __u32 opcode = ll_rpc_opcode_table[i].opcode;
                 lprocfs_counter_init(svc_stats, PTLRPC_LAST_CNTR + i,
diff --git a/lustre/ptlrpc/niobuf.c b/lustre/ptlrpc/niobuf.c
index e8e46607ae..6de6be629d 100644
--- a/lustre/ptlrpc/niobuf.c
+++ b/lustre/ptlrpc/niobuf.c
@@ -35,7 +35,6 @@ static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
                          struct ptlrpc_connection *conn, int portal, __u64 xid)
 {
         int              rc;
-        int              rc2;
         ptl_md_t         md;
         char str[PTL_NALFMT_SIZE];
         ENTRY;
@@ -51,7 +50,7 @@ static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
         md.threshold = (ack == PTL_ACK_REQ) ? 2 : 1;
         md.options   = PTLRPC_MD_OPTIONS;
         md.user_ptr  = cbid;
-        md.eventq    = conn->c_peer.peer_ni->pni_eq_h;
+        md.eq_handle    = conn->c_peer.peer_ni->pni_eq_h;
 
         if (ack == PTL_ACK_REQ &&
             OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_ACK | OBD_FAIL_ONCE)) {
@@ -73,6 +72,7 @@ static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
 
         rc = PtlPut (*mdh, ack, conn->c_peer.peer_id, portal, 0, xid, 0, 0);
         if (rc != PTL_OK) {
+                int rc2;   
                 /* We're going to get an UNLINK event when I unlink below,
                  * which will complete just like any other failed send, so
                  * I fall through and return success here! */
@@ -80,7 +80,7 @@ static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
                        ptlrpc_id2str(&conn->c_peer, str),
                        portal, xid, rc);
                 rc2 = PtlMDUnlink(*mdh);
-                LASSERT (rc2 == PTL_OK);
+                LASSERTF(rc2 == PTL_OK, "rc2 = %d\n", rc2);
         }
 
         RETURN (0);
@@ -107,7 +107,7 @@ int ptlrpc_start_bulk_transfer (struct ptlrpc_bulk_desc *desc)
         peer = &desc->bd_export->exp_connection->c_peer;
 
         md.user_ptr = &desc->bd_cbid;
-        md.eventq = peer->peer_ni->pni_eq_h;
+        md.eq_handle = peer->peer_ni->pni_eq_h;
         md.threshold = 2; /* SENT and ACK/REPLY */
         md.options = PTLRPC_MD_OPTIONS;
         ptlrpc_fill_bulk_md(&md, desc);
@@ -216,7 +216,7 @@ int ptlrpc_register_bulk (struct ptlrpc_request *req)
         peer = &desc->bd_import->imp_connection->c_peer;
 
         md.user_ptr = &desc->bd_cbid;
-        md.eventq = peer->peer_ni->pni_eq_h;
+        md.eq_handle = peer->peer_ni->pni_eq_h;
         md.threshold = 1;                       /* PUT or GET */
         md.options = PTLRPC_MD_OPTIONS | 
                      ((desc->bd_type == BULK_GET_SOURCE) ? 
@@ -284,8 +284,8 @@ void ptlrpc_unregister_bulk (struct ptlrpc_request *req)
          * a chance to run client_bulk_callback() */
 
         PtlMDUnlink (desc->bd_md_h);
-        
-        if (desc->bd_req->rq_set != NULL)
+       
+        if (req->rq_set != NULL) 
                 wq = &req->rq_set->set_waitq;
         else
                 wq = &req->rq_reply_waitq;
@@ -439,7 +439,7 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         reply_md.threshold = 1;
         reply_md.options   = PTLRPC_MD_OPTIONS | PTL_MD_OP_PUT;
         reply_md.user_ptr  = &request->rq_reply_cbid;
-        reply_md.eventq    = connection->c_peer.peer_ni->pni_eq_h;
+        reply_md.eq_handle    = connection->c_peer.peer_ni->pni_eq_h;
 
         rc = PtlMDAttach(reply_me_h, reply_md, PTL_UNLINK, 
                          &request->rq_reply_md_h);
@@ -523,7 +523,7 @@ int ptlrpc_register_rqbd (struct ptlrpc_request_buffer_desc *rqbd)
         md.threshold = PTL_MD_THRESH_INF;
         md.options   = PTLRPC_MD_OPTIONS | PTL_MD_OP_PUT | PTL_MD_MAX_SIZE;
         md.user_ptr  = &rqbd->rqbd_cbid;
-        md.eventq    = srv_ni->sni_ni->pni_eq_h;
+        md.eq_handle = srv_ni->sni_ni->pni_eq_h;
         
         rc = PtlMDAttach(me_h, md, PTL_UNLINK, &rqbd->rqbd_md_h);
         if (rc == PTL_OK)
diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c
index 8a279cd71e..3b853ddabf 100644
--- a/lustre/ptlrpc/pack_generic.c
+++ b/lustre/ptlrpc/pack_generic.c
@@ -636,11 +636,6 @@ void lustre_swab_mds_body (struct mds_body *b)
         __swab32s (&b->eadatasize);
         __swab32s (&b->mds);
 }
-void lustre_swab_clonefs_info (struct clonefs_info *clone)
-{
-       __swab32s(&clone->clone_index);
-       __swab32s(&clone->clone_flags); 
-}
 void lustre_swab_mds_rec_setattr (struct mds_rec_setattr *sa)
 {
         __swab32s (&sa->sa_opcode);
@@ -826,7 +821,7 @@ void lustre_swab_llogd_conn_body (struct llogd_conn_body *d)
 void lustre_assert_wire_constants(void)
 {
         /* Wire protocol assertions generated by 'wirecheck'
-         * running on Linux build 2.4.24-cmd #1 SMP Wed Aug 18 14:24:44 MDT 2004 i686 i686 i386 GNU/L
+         * running on Linux build 2.4.24-cmd2 #1 SMP Tue Sep 14 10:34:54 MDT 2004 i686 i686 i386 GNU/
          * with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7) */
 
 
@@ -895,8 +890,8 @@ void lustre_assert_wire_constants(void)
                  (long long)OST_REQ_HAS_OA1);
         LASSERTF(MDS_GETATTR == 33, " found %lld\n",
                  (long long)MDS_GETATTR);
-        LASSERTF(MDS_GETATTR_NAME == 34, " found %lld\n",
-                 (long long)MDS_GETATTR_NAME);
+        LASSERTF(MDS_GETATTR_LOCK == 34, " found %lld\n",
+                 (long long)MDS_GETATTR_LOCK);
         LASSERTF(MDS_CLOSE == 35, " found %lld\n",
                  (long long)MDS_CLOSE);
         LASSERTF(MDS_REINT == 36, " found %lld\n",
@@ -1077,7 +1072,7 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct obdo, o_gr));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_gr) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_gr));
-        LASSERTF((int)offsetof(struct obdo, o_atime) == 16, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_atime) == 32, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_atime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_atime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_atime));
@@ -1085,11 +1080,11 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct obdo, o_mtime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_mtime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_mtime));
-        LASSERTF((int)offsetof(struct obdo, o_ctime) == 32, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_ctime) == 40, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_ctime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_ctime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_ctime));
-        LASSERTF((int)offsetof(struct obdo, o_size) == 40, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_size) == 16, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_size));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_size) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_size));
diff --git a/lustre/ptlrpc/pers.c b/lustre/ptlrpc/pers.c
index fff71f0ee1..bcbf0951d7 100644
--- a/lustre/ptlrpc/pers.c
+++ b/lustre/ptlrpc/pers.c
@@ -104,10 +104,14 @@ static int can_merge_iovs(ptl_md_iovec_t *existing, ptl_md_iovec_t *candidate)
 {
         if (existing->iov_base + existing->iov_len == candidate->iov_base) 
                 return 1;
-
+        /* XXX it's good to have an warning here, but user-level echo_client
+         * will hit this. reenable it when we fixed echo_client.
+         */
+#if 0
         CERROR("Can't merge iovs %p for %x, %p for %x\n",
                existing->iov_base, existing->iov_len,
                candidate->iov_base, candidate->iov_len);
+#endif        
         return 0;
 }
 
diff --git a/lustre/ptlrpc/ptlrpc_internal.h b/lustre/ptlrpc/ptlrpc_internal.h
index 3fca88362e..e49b5f941e 100644
--- a/lustre/ptlrpc/ptlrpc_internal.h
+++ b/lustre/ptlrpc/ptlrpc_internal.h
@@ -101,6 +101,7 @@ enum {
         PTLRPC_REQWAIT_CNTR = 0,
         PTLRPC_REQQDEPTH_CNTR,
         PTLRPC_REQACTIVE_CNTR,
+        PTLRPC_REQBUF_AVAIL_CNTR,
         PTLRPC_LAST_CNTR
 };
 
diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c
index 430eba3eaf..5c59f024cc 100644
--- a/lustre/ptlrpc/ptlrpc_module.c
+++ b/lustre/ptlrpc/ptlrpc_module.c
@@ -186,7 +186,6 @@ EXPORT_SYMBOL(lustre_swab_ldlm_reply);
 EXPORT_SYMBOL(lustre_swab_ptlbd_op);
 EXPORT_SYMBOL(lustre_swab_ptlbd_niob);
 EXPORT_SYMBOL(lustre_swab_ptlbd_rsp);
-EXPORT_SYMBOL(lustre_swab_clonefs_info);
 EXPORT_SYMBOL(mdc_create_pack);
 EXPORT_SYMBOL(mdc_setattr_pack);
 EXPORT_SYMBOL(mdc_unlink_pack);
diff --git a/lustre/ptlrpc/ptlrpcd.c b/lustre/ptlrpc/ptlrpcd.c
index df8a760a5a..61ce8e661c 100644
--- a/lustre/ptlrpc/ptlrpcd.c
+++ b/lustre/ptlrpc/ptlrpcd.c
@@ -35,19 +35,16 @@
 # else
 #  include <linux/locks.h>
 # endif
+# include <linux/ctype.h>
+# include <linux/init.h>
 #else /* __KERNEL__ */
 # include <liblustre.h>
+# include <ctype.h>
 #endif
 
 #include <linux/kp30.h>
 #include <linux/lustre_net.h>
 
-#ifndef  __CYGWIN__
-# include <linux/init.h>
-#else
-# include <ctype.h>
-#endif
-
 #include <linux/lustre_ha.h>
 #include <linux/obd_support.h> /* for OBD_FAIL_CHECK */
 #include <linux/lprocfs_status.h>
@@ -92,6 +89,7 @@ void ptlrpcd_add_req(struct ptlrpc_request *req)
         else 
                 pc = &ptlrpcd_recovery_pc;
 
+        do_gettimeofday(&req->rq_rpcd_start);
         ptlrpc_set_add_new_req(pc->pc_set, req);
         req->rq_ptlrpcd_data = pc;
                 
@@ -134,7 +132,12 @@ static int ptlrpcd_check(struct ptlrpcd_ctl *pc)
                         ptlrpc_req_finished (req);
                 }
         }
-
+        if (rc == 0) {
+                /* If new requests have been added, make sure to wake up */
+                spin_lock_irqsave(&pc->pc_set->set_new_req_lock, flags);
+                rc = !list_empty(&pc->pc_set->set_new_requests);
+                spin_unlock_irqrestore(&pc->pc_set->set_new_req_lock, flags);
+        }
         RETURN(rc);
 }
 
@@ -195,8 +198,11 @@ int ptlrpcd_check_async_rpcs(void *arg)
         /* single threaded!! */
         pc->pc_recurred++;
 
-        if (pc->pc_recurred == 1)
+        if (pc->pc_recurred == 1) {
                 rc = ptlrpcd_check(pc);
+                if (!rc)
+                        ptlrpc_expired_set(pc->pc_set);
+        }
 
         pc->pc_recurred--;
         return rc;
diff --git a/lustre/ptlrpc/recov_thread.c b/lustre/ptlrpc/recov_thread.c
index c317270516..0462a553aa 100644
--- a/lustre/ptlrpc/recov_thread.c
+++ b/lustre/ptlrpc/recov_thread.c
@@ -141,40 +141,33 @@ int llog_obd_repl_cancel(struct llog_ctxt *ctxt, int count,
         ENTRY;
 
         LASSERT(ctxt);
-
+        down(&ctxt->loc_sem);
         if (ctxt->loc_imp == NULL) {
                 CWARN("no import for ctxt %p\n", ctxt);
-                RETURN(0);
-        }
-
-        if (count == 0 || cookies == NULL) {
-                down(&ctxt->loc_sem);
-                if (ctxt->loc_llcd == NULL || !(flags & OBD_LLOG_FL_SENDNOW))
-                        GOTO(out, rc);
-
-                llcd = ctxt->loc_llcd;
-                GOTO(send_now, rc);
+                GOTO(out, rc = 0);
         }
 
-        down(&ctxt->loc_sem);
         llcd = ctxt->loc_llcd;
-        if (llcd == NULL) {
-                llcd = llcd_grab();
-                if (llcd == NULL) {
-                        CERROR("couldn't get an llcd - dropped "LPX64":%x+%u\n",
-                               cookies->lgc_lgl.lgl_oid,
-                               cookies->lgc_lgl.lgl_ogen, cookies->lgc_index);
-                        GOTO(out, rc = -ENOMEM);
+        if (count > 0 && cookies != NULL) {
+                if (llcd == NULL) {      
+                        llcd = llcd_grab();
+                        if (llcd == NULL) {
+                                CERROR("couldn't get an llcd - dropped "LPX64":%x+%u\n",
+                                       cookies->lgc_lgl.lgl_oid,
+                                       cookies->lgc_lgl.lgl_ogen, cookies->lgc_index);
+                                GOTO(out, rc = -ENOMEM);
+                        }
+                        llcd->llcd_ctxt = ctxt;
+                        ctxt->loc_llcd = llcd;
                 }
-                llcd->llcd_ctxt = ctxt;
-                ctxt->loc_llcd = llcd;
+                memcpy((char *)llcd->llcd_cookies + llcd->llcd_cookiebytes,
+                       cookies, sizeof(*cookies));
+                llcd->llcd_cookiebytes += sizeof(*cookies);
+        } else {
+                if (llcd == NULL || !(flags & OBD_LLOG_FL_SENDNOW))
+                        GOTO(out, rc);
         }
 
-        memcpy((char *)llcd->llcd_cookies + llcd->llcd_cookiebytes, cookies,
-               sizeof(*cookies));
-        llcd->llcd_cookiebytes += sizeof(*cookies);
-
-send_now:
         if ((LLCD_SIZE - llcd->llcd_cookiebytes < sizeof(*cookies) ||
              flags & OBD_LLOG_FL_SENDNOW)) {
                 CDEBUG(D_HA, "send llcd %p:%p\n", llcd, llcd->llcd_ctxt);
@@ -195,12 +188,12 @@ int llog_obd_repl_sync(struct llog_ctxt *ctxt, struct obd_export *exp)
         if (exp && (ctxt->loc_imp == exp->exp_imp_reverse)) {
                 down(&ctxt->loc_sem);
                 if (ctxt->loc_llcd != NULL) {
-                        CWARN("import will be destroyed, put "
-                              "llcd %p:%p\n", ctxt->loc_llcd, ctxt);
                         llcd_put(ctxt->loc_llcd);
                         ctxt->loc_llcd = NULL;
-                        ctxt->loc_imp = NULL;
                 }
+                CWARN("reverse import disconnected, put "
+                      "llcd %p:%p\n", ctxt->loc_llcd, ctxt);
+                ctxt->loc_imp = NULL;
                 up(&ctxt->loc_sem);
         } else {
                 rc = llog_cancel(ctxt, 0, NULL, OBD_LLOG_FL_SENDNOW, NULL);
@@ -341,11 +334,11 @@ static int log_commit_thread(void *arg)
                                 continue;
                         }
 
+                        up(&llcd->llcd_ctxt->loc_sem);
                         request = ptlrpc_prep_req(import, LUSTRE_LOG_VERSION,
                                                   OBD_LOG_CANCEL, 1,
                                                   &llcd->llcd_cookiebytes,
                                                   bufs);
-                        up(&llcd->llcd_ctxt->loc_sem);
 
                         if (request == NULL) {
                                 rc = -ENOMEM;
@@ -509,6 +502,7 @@ static int log_process_thread(void *args)
         lock_kernel();
         ptlrpc_daemonize(); /* thread never needs to do IO */
 
+        THREAD_NAME(current->comm, sizeof(current->comm) - 1, "llog_process");
         SIGNAL_MASK_LOCK(current, flags);
         sigfillset(&current->blocked);
         RECALC_SIGPENDING;
diff --git a/lustre/ptlrpc/recover.c b/lustre/ptlrpc/recover.c
index 66b172743e..c3eaf17966 100644
--- a/lustre/ptlrpc/recover.c
+++ b/lustre/ptlrpc/recover.c
@@ -405,6 +405,9 @@ void ptlrpc_fail_export(struct obd_export *exp)
         CDEBUG(D_HA, "disconnecting export %p/%s\n",
                exp, exp->exp_client_uuid.uuid);
 
+        if (obd_dump_on_timeout)
+                portals_debug_dumplog();
+
         /* Most callers into obd_disconnect are removing their own reference
          * (request, for example) in addition to the one from the hash table.
          * We don't have such a reference here, so make one. */
diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c
index 388fd012fd..512f62d87f 100644
--- a/lustre/ptlrpc/service.c
+++ b/lustre/ptlrpc/service.c
@@ -32,6 +32,10 @@
 #include <portals/types.h>
 #include "ptlrpc_internal.h"
 
+/* forward ref */
+static int ptlrpc_server_post_idle_rqbds (struct ptlrpc_service *svc);
+
+
 static LIST_HEAD (ptlrpc_all_services);
 static spinlock_t ptlrpc_all_services_lock = SPIN_LOCK_UNLOCKED;
 
@@ -117,6 +121,29 @@ ptlrpc_free_rqbd(struct ptlrpc_request_buffer_desc *rqbd)
         OBD_FREE (rqbd, sizeof (*rqbd));
 }
 
+int
+ptlrpc_grow_req_bufs(struct ptlrpc_srv_ni *srv_ni)
+{
+        struct ptlrpc_service             *svc = srv_ni->sni_service;
+        struct ptlrpc_request_buffer_desc *rqbd;
+        int                                i;
+
+        for (i = 0; i < svc->srv_nbuf_per_group; i++) {
+                rqbd = ptlrpc_alloc_rqbd(srv_ni);
+
+                if (rqbd == NULL) {
+                        CERROR ("%s/%s: Can't allocate request buffer\n",
+                                svc->srv_name, srv_ni->sni_ni->pni_name);
+                        return (-ENOMEM);
+                }
+
+                if (ptlrpc_server_post_idle_rqbds(svc) < 0)
+                        return (-EAGAIN);
+        }
+
+        return (0);
+}
+
 void
 ptlrpc_save_llog_lock(struct ptlrpc_request *req, struct llog_create_locks *lcl)
 {
@@ -225,28 +252,32 @@ ptlrpc_server_post_idle_rqbds (struct ptlrpc_service *svc)
         struct ptlrpc_request_buffer_desc *rqbd;
         unsigned long                      flags;
         int                                rc;
+        int                                posted = 0;
 
-        spin_lock_irqsave(&svc->srv_lock, flags);
-        if (list_empty (&svc->srv_idle_rqbds)) {
+        for (;;) {
+                spin_lock_irqsave(&svc->srv_lock, flags);
+                if (list_empty (&svc->srv_idle_rqbds)) {
+                        spin_unlock_irqrestore(&svc->srv_lock, flags);
+                        return (posted);
+                }
+                rqbd = list_entry(svc->srv_idle_rqbds.next,
+                                  struct ptlrpc_request_buffer_desc,
+                                  rqbd_list);
+                list_del (&rqbd->rqbd_list);
+
+                /* assume we will post successfully */
+                srv_ni = rqbd->rqbd_srv_ni;
+                srv_ni->sni_nrqbd_receiving++;
+                list_add (&rqbd->rqbd_list, &srv_ni->sni_active_rqbds);
                 spin_unlock_irqrestore(&svc->srv_lock, flags);
-                return (0);
-        }
-
-        rqbd = list_entry(svc->srv_idle_rqbds.next,
-                          struct ptlrpc_request_buffer_desc,
-                          rqbd_list);
-        list_del (&rqbd->rqbd_list);
 
-        /* assume we will post successfully */
-        srv_ni = rqbd->rqbd_srv_ni;
-        srv_ni->sni_nrqbd_receiving++;
-        list_add (&rqbd->rqbd_list, &srv_ni->sni_active_rqbds);
+                rc = ptlrpc_register_rqbd(rqbd);
+                if (rc != 0)
+                        break;
 
-        spin_unlock_irqrestore(&svc->srv_lock, flags);
+                posted = 1;
+        }
 
-        rc = ptlrpc_register_rqbd(rqbd);
-        if (rc == 0)
-                return (1);
 
         spin_lock_irqsave(&svc->srv_lock, flags);
 
@@ -275,11 +306,10 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
                 struct proc_dir_entry *proc_entry)
 {
         int                                i;
-        int                                j;
+        int                                rc;
         int                                ssize;
         struct ptlrpc_service             *service;
         struct ptlrpc_srv_ni              *srv_ni;
-        struct ptlrpc_request_buffer_desc *rqbd;
         ENTRY;
 
         LASSERT (ptlrpc_ninterfaces > 0);
@@ -297,6 +327,7 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
         INIT_LIST_HEAD(&service->srv_threads);
         init_waitqueue_head(&service->srv_waitq);
 
+        service->srv_nbuf_per_group = nbufs;
         service->srv_max_req_size = max_req_size;
         service->srv_buf_size = bufsize;
         service->srv_rep_portal = rep_portal;
@@ -328,22 +359,11 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
                 CDEBUG (D_NET, "%s: initialising interface %s\n", name,
                         srv_ni->sni_ni->pni_name);
 
-                for (j = 0; j < nbufs; j++) {
-                        rqbd = ptlrpc_alloc_rqbd (srv_ni);
-                        
-                        if (rqbd == NULL) {
-                                CERROR ("%s.%d: Can't allocate request %d "
-                                        "on %s\n", name, i, j, 
-                                        srv_ni->sni_ni->pni_name);
-                                GOTO(failed, NULL);
-                        }
-
-                        /* We shouldn't be under memory pressure at
-                         * startup, so fail if we can't post all our
-                         * buffers at this time. */
-                        if (ptlrpc_server_post_idle_rqbds(service) <= 0)
-                                GOTO(failed, NULL);
-                }
+                rc = ptlrpc_grow_req_bufs(srv_ni);
+                /* We shouldn't be under memory pressure at startup, so
+                 * fail if we can't post all our buffers at this time. */
+                if (rc != 0)
+                        GOTO(failed, NULL);
         }
 
         if (proc_entry != NULL)
@@ -378,6 +398,7 @@ ptlrpc_server_free_request(struct ptlrpc_service *svc, struct ptlrpc_request *re
         ptlrpc_free_server_req(req);
 }
 
+static char str[PTL_NALFMT_SIZE];
 static int 
 ptlrpc_server_handle_request (struct ptlrpc_service *svc)
 {
@@ -388,7 +409,6 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
         struct timeval         work_end;
         long                   timediff;
         int                    rc;
-        char                   str[PTL_NALFMT_SIZE];
         ENTRY;
 
         spin_lock_irqsave (&svc->srv_lock, flags);
@@ -448,8 +468,9 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
          * client's timeout is similar to mine, she'll be timing out this
          * REQ anyway (bug 1502) */
         if (timediff / 1000000 > (long)obd_timeout) {
-                CERROR("Dropping timed-out request from %s: %ld seconds old\n",
-                       ptlrpc_peernid2str(&request->rq_peer, str), 
+                CERROR("Dropping timed-out opc %d request from %s"
+                       ": %ld seconds old\n", request->rq_reqmsg->opc,
+                       ptlrpc_peernid2str(&request->rq_peer, str),
                        timediff / 1000000);
                 goto out;
         }
@@ -481,8 +502,9 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
                request->rq_peer.peer_ni->pni_name,
                ptlrpc_peernid2str(&request->rq_peer, str),
                request->rq_reqmsg->opc);
-
+        request->rq_svc = svc;
         rc = svc->srv_handler(request);
+        request->rq_svc = NULL;
         CDEBUG(D_RPCTRACE, "Handled RPC pname:cluuid+ref:pid:xid:ni:nid:opc "
                "%s:%s+%d:%d:"LPU64":%s:%s:%d\n", current->comm,
                (request->rq_export ?
@@ -684,6 +706,26 @@ void ptlrpc_daemonize(void)
         reparent_to_init();
 }
 
+static void
+ptlrpc_check_rqbd_pools(struct ptlrpc_service *svc)
+{
+        struct ptlrpc_srv_ni  *sni;
+        int                    i;
+        int                    avail = 0;
+        int                    low_water = svc->srv_nbuf_per_group/2;
+
+        for (i = 0; i < ptlrpc_ninterfaces; i++) {
+                sni = &svc->srv_interfaces[i];
+
+                avail += sni->sni_nrqbd_receiving;
+                /* NB I'm not locking; just looking. */
+                if (sni->sni_nrqbd_receiving <= low_water)
+                        ptlrpc_grow_req_bufs(sni);
+        }
+
+        lprocfs_counter_add(svc->srv_stats, PTLRPC_REQBUF_AVAIL_CNTR, avail);
+}
+
 static int
 ptlrpc_retry_rqbds(void *arg)
 {
@@ -743,7 +785,9 @@ static int ptlrpc_main(void *arg)
                                 svc->srv_n_active_reqs <
                                 (svc->srv_nthreads - 1))),
                               &lwi);
-
+                
+                ptlrpc_check_rqbd_pools(svc);
+                
                 if (!list_empty (&svc->srv_reply_queue))
                         ptlrpc_server_handle_reply (svc);
 
diff --git a/lustre/scripts/Makefile.am b/lustre/scripts/Makefile.am
index 5e57916f33..5a6ea9c68e 100644
--- a/lustre/scripts/Makefile.am
+++ b/lustre/scripts/Makefile.am
@@ -4,10 +4,13 @@
 # See the file COPYING in this distribution
 
 EXTRA_DIST = license-status maketags.sh lustre.spec version_tag.pl.in	\
-	$(initd_SCRIPTS) lustre.spec.in lustre-kernel-2.4.spec.in	\
+	lustre lustrefs lustre.spec.in lustre-kernel-2.4.spec.in       \
 	lmake linux-merge-config.awk linux-merge-modules.awk		\
 	linux-rhconfig.h
 
 initddir = $(sysconfdir)/init.d
-initd_SCRIPTS = lustre
+if UTILS
+initd_SCRIPTS = lustre lustrefs
+endif
+
 
diff --git a/lustre/scripts/branch.sh b/lustre/scripts/branch.sh
index 875c71d547..d673ccbfcf 100755
--- a/lustre/scripts/branch.sh
+++ b/lustre/scripts/branch.sh
@@ -9,6 +9,7 @@ fi
 parent=$1
 child=$2
 CHILD=`echo $child | sed -e "s/^b_//" | tr "[a-z]" "[A-Z]"`
+date=`date +%Y%m%d_%H%M`
 module=lustre
 
 case $parent in
@@ -29,11 +30,15 @@ fi
 
 echo parent: $parent CHILD: $CHILD child: $child date: $date
 
-echo -n "tagging $parent as '${CHILD}_BASE' ...."
-$CVS rtag -r $parent ${CHILD}_BASE $module
+echo -n "Tagging $parent as ${CHILD}_BASE_$date ..."
+cvs rtag -r $parent ${CHILD}_BASE_$date $module
+echo "done"
+echo -n "tagging ${CHILD}_BASE_$date as '${CHILD}_BASE' ...."
+$CVS rtag -r ${CHILD}_BASE_$date ${CHILD}_BASE $module
 echo "done"
 echo -n "branching $child at ${CHILD}_BASE' ...."
 $CVS rtag -b -r ${CHILD}_BASE $child $module
+echo "done"
 echo -n "updating to $child ...."
 $CVS update -r $child
 echo "done"
diff --git a/lustre/scripts/cvsdiffclient b/lustre/scripts/cvsdiffclient
index 45325c7c48..52ef30a8c3 100755
--- a/lustre/scripts/cvsdiffclient
+++ b/lustre/scripts/cvsdiffclient
@@ -21,10 +21,14 @@ if [ -f $TMP ]; then
 		[ "$OPERATION" ] || OPERATION=Update
 		[ "$OPERWHERE" ] || OPERWHERE=from
 		echo "CVS: $OPERATION $child $OPERWHERE $parent ($date)" >> $TMP
+        elif [ -r CVS/Tag ]; then
+        	echo "CVS: Branch: `sed 's/^T//' CVS/Tag`" >> $TMP
+
 	fi
 	echo "CVS: did you update the ChangeLog for a bug fix?" >> $TMP
-	echo "CVS: b=" >> $TMP
-	echo "CVS: r=" >> $TMP
+        echo "CVS: did you update the hours spent in Bugzilla?" >> $TMP
+        echo "CVS: b=<bug>" >> $TMP
+        echo "CVS: r=<reviewed_by>" >> $TMP
 
 	cat $1 >> $TMP
 	cp $TMP $1
diff --git a/lustre/scripts/land1.sh b/lustre/scripts/land1.sh
index 08f559a05b..98fd72172d 100755
--- a/lustre/scripts/land1.sh
+++ b/lustre/scripts/land1.sh
@@ -45,7 +45,7 @@ TEST_FILE=${TEST_FILE:-ChangeLog} # does this need to be smarter?
 check_tag() {
 	[ -z "$1" ] && echo "check_tag() missing arg" && exit3
 	[ "$1" = "HEAD" ] && return
-	$CVS log $TEST_FILE | grep -q "	$1: " && return
+	$CVS log $TEST_FILE 2> /dev/null | grep -q "	$1: " && return
 	echo "$0: tag $1 not found in $TEST_FILE"
 	exit 2
 }
@@ -107,4 +107,4 @@ else
 fi
 echo "done"
 
-echo "Test, commit and then run land2.sh (no arguments)"
+echo "Build, test, commit and then run land2.sh (no arguments)"
diff --git a/lustre/scripts/lbuild b/lustre/scripts/lbuild
index 8f599693da..e2e9970070 100755
--- a/lustre/scripts/lbuild
+++ b/lustre/scripts/lbuild
@@ -20,6 +20,10 @@ SERIES=
 CONFIG=
 VERSION=
 
+RHBUILD=0
+LINUX26=0
+SUSEBUILD=0
+
 BASE_ARCH=
 BIGMEM_ARCHS=
 BOOT_ARCHS=
@@ -198,12 +202,12 @@ load_target()
 
     CONFIG_FILE="$TOPDIR/lustre/kernel_patches/kernel_configs/$CONFIG"
     [ -r "$CONFIG_FILE" ] || \
-	fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/kernel_patches/kernel_configs/configs."
+ 	fatal 1 "Target $TARGET's config file $CONFIG missing from $TOPDIR/lustre/kernel_patches/kernel_configs/."
 
     if [ "$EXTRA_VERSION_save" ] ; then
 	EXTRA_VERSION="$EXTRA_VERSION_save"
     elif ! (( $RELEASE )) ; then
-	EXTRA_VERSION="${EXTRA_VERSION}-${TAG//_/}.${TIMESTAMP}"
+        EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
 
@@ -211,7 +215,7 @@ load_target()
 
     BUILD_ARCHS=
     for arch in $(uniqify "$ALL_ARCHS") ; do
-	if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep -s "$arch" ; then
+	if [ -z "$TARGET_ARCHS" ] || echo "$TARGET_ARCHS" | grep "$arch" >/dev/null 2>/dev/null ; then
 	    BUILD_ARCHS="$BUILD_ARCHS $arch"
 	fi
     done
@@ -292,9 +296,11 @@ patch_linux()
     popd >/dev/null
     echo "Full patch has been saved in ${FULL_PATCH##*/}."
     echo "Replacing .config files..."
-    [ -d linux/configs ] || mkdir linux/configs
+    [ -d linux/configs ] || mkdir linux/configs || \
+        fatal 1 "Error creating configs directory."
     rm -f linux/configs/*
-    cp -v lustre/kernel_patches/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/
+    cp -v lustre/kernel_patches/kernel_configs/kernel-${VERSION}-${TARGET}*.config linux/configs/ || \
+       fatal 1 "Error copying in kernel configs."
 }
 
 pack_linux()
@@ -332,7 +338,9 @@ prep_build()
 	-e "s/@SMP_ARCHS@/$SMP_ARCHS/g" \
 	-e "s/@UP_ARCHS@/$UP_ARCHS/g" \
 	-e "s/@RHBUILD@/$RHBUILD/g" \
-	< $TOPDIR/lustre/scripts/lustre-kernel-2.4.spec.in \
+        -e "s/@LINUX26@/$LINUX26/g" \
+        -e "s/@SUSEBUILD@/$SUSEBUILD/g" \
+        < $TOPDIR/lustre/scripts/lustre-kernel-2.4.spec.in \
 	> lustre-kernel-2.4.spec
     [ -d SRPMS ] || mkdir SRPMS
     [ -d RPMS ] || mkdir RPMS
diff --git a/lustre/scripts/lustre-kernel-2.4.spec.in b/lustre/scripts/lustre-kernel-2.4.spec.in
index f177c17e11..3aad090f5e 100644
--- a/lustre/scripts/lustre-kernel-2.4.spec.in
+++ b/lustre/scripts/lustre-kernel-2.4.spec.in
@@ -355,7 +355,12 @@ BuildKernel()
 	--kerneldir $RPM_SOURCE_DIR \
 	-j $RPM_BUILD_NCPUS \
 	--destdir $RPM_BUILD_ROOT \
-	-- @CONFIGURE_FLAGS@
+        -- --enable-modules \
+        --disable-doc --disable-tests \
+        --disable-utils --disable-liblustre \
+        --sysconfdir=%{_sysconfdir} \
+        --mandir=%{_mandir} \
+        @CONFIGURE_FLAGS@
 }
 
 BuildLustre()
@@ -371,7 +376,12 @@ BuildLustre()
 	--kerneldir $RPM_SOURCE_DIR \
 	-j $RPM_BUILD_NCPUS \
 	--destdir $RPM_BUILD_ROOT \
-	-- @CONFIGURE_FLAGS@
+        -- --enable-utils \
+        --disable-doc --disable-tests \
+        --disable-modules --disable-liblustre \
+        --sysconfdir=%{_sysconfdir} \
+        --mandir=%{_mandir} \
+        @CONFIGURE_FLAGS@
 }
 
 SaveHeaders()
@@ -401,14 +411,12 @@ BuildKernel jensen
 BuildKernel smp
 %endif
 
-# we want this one last, so that it is the one populating /usr/bin
-%if %{buildup} && %{buildbase}
+%if %{buildup}
 BuildKernel
-%elseif %{buildbase}
-BuildLustre
 %endif
 
 %if %{buildbase}
+BuildLustre
 SaveHeaders
 %endif
 
@@ -520,14 +528,14 @@ if [ -f ../../savedheaders/%{_target_cpu}/up/version.h ] ; then
     HEADER_FILE=../../savedheaders/%{_target_cpu}/up/version.h
 else
     # test build not including uniprocessor, must get info from somewhere
-    HEADER_FILE=$(ls ../../savedheaders/*/*/version.h | head -1)
+    HEADER_FILE=$(ls ../../savedheaders/*/*/version.h | head -n 1)
 fi
 grep -v UTS_RELEASE $HEADER_FILE >> version.h
 rm -rf ../../savedheaders
 } ; popd
 touch $RPM_BUILD_ROOT/boot/kernel.h-%{kversion}
 
-rm -f $RPM_BUILD_ROOT/usr/include/linux
+#rm -f $RPM_BUILD_ROOT/usr/include/linux
 
 rm -rf $RPM_BUILD_ROOT/usr/src/linux-%{KVERREL}/savedheaders
 
@@ -607,6 +615,17 @@ fi
 
 %endif
 
+%post -n lustre-lite-utils
+if [ ! -e /dev/obd ]; then
+   mknod /dev/obd c 10 241
+fi
+if [ ! -e /dev/portals ]; then
+   mknod /dev/portals c 10 240
+fi
+/sbin/chkconfig --add lustre
+/sbin/chkconfig --add lustrefs
+
+
 # Allow clean removal of modules directory
 %preun 
 /sbin/modprobe loop 2> /dev/null > /dev/null  || :
@@ -686,6 +705,13 @@ if [ -L /usr/src/%{kslnk} ]; then
 fi
 exit 0
 
+%preun -n lustre-lite-utils
+if [ $1 = 0 ]; then
+  /sbin/chkconfig --del lustre
+  /sbin/chkconfig --del lustrefs
+fi
+
+
 ###
 ### file lists
 ###
@@ -752,62 +778,7 @@ exit 0
 %files source
 %defattr(-,root,root)
 %dir /usr/src/linux-%{KVERREL}
-/usr/src/linux-%{KVERREL}/COPYING*
-/usr/src/linux-%{KVERREL}/CREDITS
-/usr/src/linux-%{KVERREL}/Documentation
-/usr/src/linux-%{KVERREL}/MAINTAINERS
-/usr/src/linux-%{KVERREL}/Makefile
-/usr/src/linux-%{KVERREL}/README
-/usr/src/linux-%{KVERREL}/REPORTING-BUGS
-/usr/src/linux-%{KVERREL}/arch
-%ifarch sparc
-/usr/src/linux-%{KVERREL}/arch/sparc64
-%endif
-/usr/src/linux-%{KVERREL}/drivers
-%if %{rhbuild}
-/usr/src/linux-%{KVERREL}/crypto
-%endif
-/usr/src/linux-%{KVERREL}/fs
-/usr/src/linux-%{KVERREL}/init
-/usr/src/linux-%{KVERREL}/ipc
-/usr/src/linux-%{KVERREL}/kernel
-/usr/src/linux-%{KVERREL}/lib
-/usr/src/linux-%{KVERREL}/mm
-/usr/src/linux-%{KVERREL}/net
-/usr/src/linux-%{KVERREL}/scripts
-%ifarch %{all_x86}
-%{?ibcs_1:/usr/src/linux-%{KVERREL}/abi}
-%endif
-/usr/src/linux-%{KVERREL}/configs
-/usr/src/linux-%{KVERREL}/include
-/usr/src/linux-%{KVERREL}/include/asm
-%ifarch %{all_x86}
-%{?ibcs_1:/usr/src/linux-%{KVERREL}/include/abi}
-%endif
-/usr/src/linux-%{KVERREL}/include/linux
-%if %{rhbuild}
-/usr/src/linux-%{KVERREL}/include/rxrpc
-%endif
-/usr/src/linux-%{KVERREL}/include/net
-/usr/src/linux-%{KVERREL}/include/pcmcia
-/usr/src/linux-%{KVERREL}/include/scsi
-/usr/src/linux-%{KVERREL}/include/video
-%if %{rhbuild}
-/usr/src/linux-%{KVERREL}/tmp_include_depends
-%endif
-%dir /usr/src/linux-%{KVERREL}/include
-%dir /usr/src/linux-%{KVERREL}/arch
-%ifarch alpha sparc
-/usr/src/linux-%{KVERREL}/include/math-emu
-%endif
-%if %{linux26}
-%dir /usr/src/linux-%{KVERREL}/crypto
-%dir /usr/src/linux-%{KVERREL}/kdb
-%dir /usr/src/linux-%{KVERREL}/rpmify
-%dir /usr/src/linux-%{KVERREL}/security
-%else
-/usr/src/linux-%{KVERREL}/Rules.make
-%endif
+/usr/src/linux-%{KVERREL}/*
 %endif
 
 %files doc
@@ -820,10 +791,15 @@ exit 0
 /sbin/*
 /usr/sbin/*
 /usr/bin/*
-/usr/lib/lustre/python
+/usr/lib/lustre
+/usr/share/lustre
 /etc/init.d/lustre
-/usr/include/lustre
-/lib/lib*.a
+/etc/init.d/lustrefs
+/usr/include/lustre/*
+/usr/include/portals/*
+/usr/include/linux/*
+/usr/lib/lib*.a
+/usr/share/man/man?/*
 
 #%files -n lustre-doc
 #%defattr(-, root, root)
@@ -831,13 +807,13 @@ exit 0
 #/usr/share/doc/lustre/lustre.pdf
 #/usr/share/doc/lustre/COPYING
 
-/usr/lib/lustre/examples
-
+/usr/share/lustre/examples
 %files -n lustre-ldap
 %defattr(-, root, root)
 /etc/openldap/slapd-lustre.conf
 /etc/openldap/schema/lustre.schema
-/usr/lib/lustre/lustre2ldif.xsl
-/usr/lib/lustre/top.ldif
+/usr/share/lustre/lustre2ldif.xsl
+/usr/share/lustre/top.ldif
+
 
 %endif # %{buildbase}
diff --git a/lustre/scripts/lustre.spec.in b/lustre/scripts/lustre.spec.in
index 329ef4c6e9..348fa7b9fd 100644
--- a/lustre/scripts/lustre.spec.in
+++ b/lustre/scripts/lustre.spec.in
@@ -68,16 +68,34 @@ Configures openldap server for LDAP Lustre config database
 %endif
 
 %build
+# if RPM_BUILD_NCPUS unset, set it
+if [ -z "$RPM_BUILD_NCPUS" ] ; then
+    RPM_BUILD_NCPUS=$(egrep -c "^cpu[0-9]+" /proc/stat || :)
+    if [ $RPM_BUILD_NCPUS -eq 0 ] ; then
+        RPM_BUILD_NCPUS=1
+    fi
+    if [ $RPM_BUILD_NCPUS -gt 8 ] ; then
+        RPM_BUILD_NCPUS=8
+    fi
+fi
+
+
 rm -rf $RPM_BUILD_ROOT
 
 # Set an explicit path to our Linux tree, if we can.
 cd $RPM_BUILD_DIR/lustre-%{version}
-./configure --with-linux='%{linuxdir}' %{disable_doc} --disable-liblustre
-make
+
+./configure \
+       --with-linux='%{linuxdir}' \
+       %{disable_doc} --disable-liblustre \
+       --sysconfdir=%{_sysconfdir} \
+       --mandir=%{_mandir}
+make -j $RPM_BUILD_NCPUS -s
+
 
 %install
 cd $RPM_BUILD_DIR/lustre-%{version}
-make install prefix=$RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
 
 %ifarch alpha
 # this hurts me
@@ -129,23 +147,18 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/ldap/lustre
 %attr(-, root, root) /usr/bin/lstripe
 %attr(-, root, root) /usr/bin/mcreate
 %attr(-, root, root) /usr/bin/munlink
-%attr(-, root, root) /usr/bin/mkdirmany
-%attr(-, root, root) /usr/bin/iopentest1
-%attr(-, root, root) /usr/bin/iopentest2
-%attr(-, root, root) /usr/lib/lustre/python/*
-%attr(-, root, root) /usr/lib/lustre/examples/llmount.sh
-%attr(-, root, root) /usr/lib/lustre/examples/llmountcleanup.sh
-%attr(-, root, root) /usr/lib/lustre/examples/llecho.sh
-%attr(-, root, root) /usr/lib/lustre/examples/local.sh
-%attr(-, root, root) /usr/lib/lustre/examples/uml.sh
-%attr(-, root, root) /usr/lib/lustre/examples/lov.sh
-%attr(-, root, root) /usr/lib/lustre/examples/echo.sh
-%attr(-, root, root) /usr/lib/lustre/examples/llechocleanup.sh
+%attr(-, root, root) /usr/lib/lustre/python
+%attr(-, root, root) /usr/share/lustre/examples
 
 %attr(-, root, root) /etc/init.d/lustre
-%attr(-, root, root) /lib/libptlctl.a
-%attr(-, root, root) /lib/liblustreapi.a
-%attr(-, root, root) /usr/include/lustre/*.h
+%attr(-, root, root) /etc/init.d/lustrefs
+%attr(-, root, root) /usr/lib/libptlctl.a
+%attr(-, root, root) /usr/lib/liblustreapi.a
+%attr(-, root, root) /usr/include/lustre
+%attr(-, root, root) /usr/include/linux/*.h
+%attr(-, root, root) /usr/include/portals
+
+%attr(-, root, root) /usr/share/man/man?/*
 
 %ifarch alpha
 %attr(-, root, root) /usr/sbin/mcpload
@@ -166,9 +179,9 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/ldap/lustre
 
 %files -n lustre-modules
 %attr(-, root, root) %doc COPYING
-%attr(-, root, root) /lib/modules/%{kversion}/kernel/fs/lustre/*.o
+%attr(-, root, root) /lib/modules/%{kversion}/kernel/fs/lustre
 #portals modules
-%attr(-, root, root) /lib/modules/%{kversion}/kernel/net/lustre/*.o
+%attr(-, root, root) /lib/modules/%{kversion}/kernel/net/lustre
 
 %files -n lustre-source
 %attr(-, root, root) /usr/src/lustre-%{version}
@@ -176,12 +189,6 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/ldap/lustre
 #%ifarch i386
 #%files -n liblustre
 #%attr(-, root, root) /lib/lustre
-#%attr(-, root, root) /lib/lustre/liblov.a
-#%attr(-, root, root) /lib/lustre/liblustreclass.a
-#%attr(-, root, root) /lib/lustre/libptlrpc.a
-#%attr(-, root, root) /lib/lustre/libobdecho.a
-#%attr(-, root, root) /lib/lustre/libldlm.a
-#%attr(-, root, root) /lib/lustre/libosc.a
 #%attr(-, root, root) /usr/sbin/lctl
 #%attr(-, root, root) /usr/sbin/lfind
 #%attr(-, root, root) /usr/sbin/lstripe
@@ -198,11 +205,22 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/ldap/lustre
 %files -n lustre-ldap
 %attr(-, root, root) /etc/openldap/slapd-lustre.conf
 %attr(-, root, root) /etc/openldap/schema/lustre.schema
-%attr(-, root, root) /usr/lib/lustre/lustre2ldif.xsl
-%attr(-, root, root) /usr/lib/lustre/top.ldif
+%attr(-, root, root) /usr/share/lustre/lustre2ldif.xsl
+%attr(-, root, root) /usr/share/lustre/top.ldif
 #%dir /var/lib/ldap/lustre
 %attr(700, ldap, ldap) /var/lib/ldap/lustre
 
+
+%post
+/sbin/chkconfig --add lustre
+/sbin/chkconfig --add lustrefs
+
+%preun
+if [ $1 = 0 ]; then
+  /sbin/chkconfig --del lustre
+  /sbin/chkconfig --del lustrefs
+fi
+
 %post -n lustre-modules
 if [ ! -e /dev/obd ]; then
    mknod /dev/obd c 10 241
diff --git a/lustre/scripts/lustrefs b/lustre/scripts/lustrefs
new file mode 100644
index 0000000000..976e8e718d
--- /dev/null
+++ b/lustre/scripts/lustrefs
@@ -0,0 +1,84 @@
+#!/bin/bash
+#
+# lustrefs      Mount Lustre filesystems.
+#
+# Authors:      Jacob Berkman <jacob@clusterfs.com>
+#
+# Based on the netfs script:
+#
+# Authors:	Bill Nottingham <notting@redhat.com>
+# 		Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
+#
+# chkconfig: 345 25 75
+# description: Mounts and unmounts all Lustre mount points.
+#
+### BEGIN INIT INFO
+# Provides: $local_fs $remote_fs
+### END INIT INFO
+
+[ -f /etc/sysconfig/network ] || exit 0
+. /etc/init.d/functions
+. /etc/sysconfig/network
+
+# Check that networking is up.
+[ "${NETWORKING}" = "no" ] && exit 0
+
+LUSTREFSTAB=`LC_ALL=C awk '!/^#/ && $3 == "lustre" && $4 !~ /noauto/ { print $2 }' /etc/fstab`
+LUSTREMTAB=`LC_ALL=C awk '!/^#/ && $3 == "lustre" { print $2 }' /proc/mounts`
+
+# See how we were called.
+case "$1" in
+  start)
+	[ -n "$LUSTREFSTAB" ] && action $"Mounting Lustre filesystems: " mount -a -t lustre
+	touch /var/lock/subsys/lustrefs
+	;;
+  stop)
+  	[ -n "$LUSTREMTAB" ] && {
+		sig=
+		retry=3
+		remaining=`LC_ALL=C awk '!/^#/ && $3 ~ /^lustre/ && $2 != "/" {print $2}' /proc/mounts`
+		while [ -n "$remaining" -a "$retry" -gt 0 ]
+		do
+			if [ "$retry" -lt 3 ]; then
+				action $"Unmounting Lustre filesystems (retry): " umount -f -a -t lustre
+			else
+				action $"Unmounting Lustre filesystems: " umount -a -t lustre
+			fi
+			sleep 2
+			remaining=`LC_ALL=C awk '!/^#/ && $3 ~ /^lustre/ && $2 != "/" {print $2}' /proc/mounts`
+			[ -z "$remaining" ] && break
+			/sbin/fuser -k -m $sig $remaining >/dev/null
+			sleep 5
+			retry=$(($retry - 1))
+			sig=-9
+		done
+	}
+	rm -f /var/lock/subsys/lustrefs
+	;;
+  status)
+	if [ -f /proc/mounts ] ; then
+		[ -n "$LUSTREFSTAB" ] && {
+		      echo $"Configured Lustre mountpoints: "
+		      for fs in $LUSTREFSTAB; do echo $fs ; done
+		}
+		[ -n "$LUSTREMTAB" ] && {
+                      echo $"Active Lustre mountpoints: "
+		      for fs in $LUSTREMTAB; do echo $fs ; done
+		}
+	else
+		echo $"/proc filesystem unavailable"
+	fi
+	;;
+  restart)
+	$0 stop
+	$0 start
+	;;
+  reload)
+        $0 start
+	;;
+  *)
+	echo $"Usage: $0 {start|stop|restart|reload|status}"
+	exit 1
+esac
+
+exit 0
diff --git a/lustre/scripts/merge1.sh b/lustre/scripts/merge1.sh
index 5fefc71287..5eb7a4b3db 100755
--- a/lustre/scripts/merge1.sh
+++ b/lustre/scripts/merge1.sh
@@ -45,7 +45,7 @@ TEST_FILE=${TEST_FILE:-ChangeLog} # does this need to be smarter?
 check_tag() {
 	[ -z "$1" ] && echo "check_tag() missing arg" && exit3
 	[ "$1" = "HEAD" ] && return
-	$CVS log $TEST_FILE | grep -q "	$1: " && return
+	$CVS log $TEST_FILE 2> /dev/null | grep -q "	$1: " && return
 	echo "$0: tag $1 not found in $TEST_FILE"
 	exit 2
 }
@@ -61,7 +61,7 @@ CHILD=$CHILD
 date=$date
 module=$module
 CONFLICTS=$CONFLICTS
-OPERATION=Merge
+OPERATION=Update
 OPERWHERE=from
 EOF
 
@@ -80,7 +80,7 @@ $CVS update -j ${CHILD}_BASE -j ${PARENT}_${CHILD}_UPDATE_PARENT_$date -dP
 echo "done"
 
 echo -n "Recording conflicts in $CONFLICTS ..."
-if $CVS update | grep '^C' > $CONFLICTS; then
+if $CVS update | awk '/^C/ { print $2 }' > $CONFLICTS; then
     echo "Conflicts found, fix before committing."
     cat $CONFLICTS
 else 
@@ -89,4 +89,4 @@ else
 fi
 echo "done"
 
-echo "Test, commit and then run merge2.sh (no arguments)"
+echo "Build, test, commit and then run merge2.sh (no arguments)"
diff --git a/lustre/tests/.cvsignore b/lustre/tests/.cvsignore
index bc148be169..3fa72faf37 100644
--- a/lustre/tests/.cvsignore
+++ b/lustre/tests/.cvsignore
@@ -65,3 +65,6 @@ ll_dirstripe_verify
 openfilleddirunlink
 copy_attr
 rename_many
+mmap_sanity
+memhog
+
diff --git a/lustre/tests/Makefile.am b/lustre/tests/Makefile.am
index a74483c275..5c603f7942 100644
--- a/lustre/tests/Makefile.am
+++ b/lustre/tests/Makefile.am
@@ -3,82 +3,44 @@ AM_CPPFLAGS = $(LLCPPFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 AM_CFLAGS = $(LLCFLAGS)
 # LDADD = -lldap
 # LDADD := -lreadline -ltermcap # -lefence
-EXTRA_DIST = $(pkgexample_SCRIPTS) $(noinst_SCRIPTS) $(noinst_DATA) \
-	sanity.sh rundbench
-if TESTS
-pkgexample_SCRIPTS = llmount.sh llmountcleanup.sh llecho.sh llechocleanup.sh
-pkgexample_SCRIPTS += local.sh echo.sh uml.sh lov.sh
+
+pkgexample_scripts = llmount.sh llmountcleanup.sh llecho.sh llechocleanup.sh
+pkgexample_scripts += local.sh echo.sh uml.sh lov.sh
+
 noinst_DATA =
 noinst_SCRIPTS = leak_finder.pl llecho.sh llmount.sh llmountcleanup.sh tbox.sh
 noinst_SCRIPTS += llrmount.sh runfailure-mds runvmstat runfailure-net
 noinst_SCRIPTS += runfailure-ost runiozone runregression-net.sh runtests
 noinst_SCRIPTS += sanity.sh rundbench
+
+EXTRA_DIST = $(pkgexample_scripts) $(noinst_SCRIPTS) $(noinst_DATA) \
+       sanity.sh rundbench
+if TESTS
+pkgexample_SCRIPTS = $(pkgexample_scripts)
+
 noinst_PROGRAMS = openunlink testreq truncate directio openme writeme open_delay
 noinst_PROGRAMS += tchmod toexcl fsx test_brw openclose createdestroy
 noinst_PROGRAMS += stat createmany statmany multifstat createtest mlink utime
 noinst_PROGRAMS += opendirunlink opendevunlink unlinkmany fchdir_test checkstat
 noinst_PROGRAMS += wantedi statone runas openfile getdents mkdirdeep o_directory
 noinst_PROGRAMS += small_write multiop sleeptest ll_sparseness_verify cmknod
-noinst_PROGRAMS += ll_sparseness_write mrename ll_dirstripe_verify copy_attr
-noinst_PROGRAMS += openfilleddirunlink rename_many
-# noinst_PROGRAMS += ldaptest
-bin_PROGRAMS = mcreate munlink mkdirmany iopentest1 iopentest2
+
+noinst_PROGRAMS += ll_sparseness_write mrename ll_dirstripe_verify mkdirmany rmdirmany
+noinst_PROGRAMS += openfilleddirunlink rename_many memhog iopentest1 iopentest2
+noinst_PROGRAMS += mmap_sanity
+# noinst_PROGRAMS += ldaptest copy_attr
+bin_PROGRAMS = mcreate munlink
 endif # TESTS
 
 # ldaptest_SOURCES = ldaptest.c
-tchmod_SOURCES = tchmod.c
-toexcl_SOURCES = toexcl.c
-testreq_SOURCES = testreq.c
-mcreate_SOURCES = mcreate.c
-iopentest1_SOURCES = iopentest1.c
-iopentest2_SOURCES = iopentest2.c
-munlink_SOURCES = munlink.c
-mlink_SOURCES = mlink.c
-truncate_SOURCES = truncate.c
-directio_SOURCES = directio.c
-openunlink_SOURCES = openunlink.c
-openme_SOURCES = openme.c
-writeme_SOURCES = writeme.c
-fsx_SOURCES = fsx.c
-test_brw_SOURCES = test_brw.c
-openclose_SOURCES = openclose.c
-createdestroy_SOURCES = createdestroy.c
+
 stat_SOURCES = stat.c stat_fs.h
-createmany_SOURCES = createmany.c
-statmany_SOURCES = statmany.c
-unlinkmany_SOURCES = unlinkmany.c
-statone_SOURCES = statone.c
-mkdirmany_SOURCES = mkdirmany.c
-multifstat_SOURCES = multifstat.c
-checkstat_SOURCES = checkstat.c
-runas_SOURCES = runas.c
-openfile_SOURCES = openfile.c
-wantedi_SOURCES = wantedi.c
-createtest_SOURCES = createtest.c
-open_delay_SOURCES = open_delay.c
-opendirunlink_SOURCES = opendirunlink.c
-openfilleddirunlink_SOURCES = openfilleddirunlink.c
-opendevunlink_SOURCES = opendevunlink.c
-fchdir_test_SOURCES = fchdir_test.c
-getdents_SOURCES=getdents.c
-o_directory_SOURCES = o_directory.c
-utime_SOURCES = utime.c
-cmknod_SOURCES = cmknod.c
-mkdirdeep_SOURCES = mkdirdeep.c
 mkdirdeep_LDADD=-L$(top_builddir)/portals/utils -lptlctl $(LIBREADLINE)
-small_write_SOURCES = small_write.c
-sleeptest_SOURCES = sleeptest.c
-rename_many_SOURCES = rename_many.c
-#write_append_truncate_SOURCES=write_append_truncate.c
 #write_append_truncate_CC=mpicc
-#createmany_mpi_SOURCES=createmany_mpi.c
 #createmany_mpi_CC=mpicc
 #parallel_grouplock_SOURCES=parallel_grouplock.c lp_utils.c
 #parallel_grouplock_CC=mpicc
-copy_attr_SOURCES= copy_attr.c
-copy_attr_LDADD= -lattr
 
-#sanity test 
-ll_sparseness_verify_SOURCES = ll_sparseness_verify.c
-ll_sparseness_write_SOURCES = ll_sparseness_write.c
-ll_dirstripe_verify_SOURCE = ll_dirstripe_verify.c
+#copy_attr_LDADD= -lattr
+mmap_sanity_SOURCES= mmap_sanity.c
+
diff --git a/lustre/tests/acceptance-small.sh b/lustre/tests/acceptance-small.sh
index 1387cf3aef..a64c7461db 100755
--- a/lustre/tests/acceptance-small.sh
+++ b/lustre/tests/acceptance-small.sh
@@ -165,6 +165,10 @@ if [ "$REPLAY_OST_SINGLE" != "no" ]; then
         sh replay-ost-single.sh
 fi
 
+if [ "$REPLAY_DUAL" != "no" ]; then
+        sh replay-dual.sh
+fi
+
 if [ "$INSANITY" != "no" ]; then
         sh insanity.sh -r
 fi
diff --git a/lustre/tests/cfg/insanity-local.sh b/lustre/tests/cfg/insanity-local.sh
index a4839c80a1..9a76a002be 100644
--- a/lustre/tests/cfg/insanity-local.sh
+++ b/lustre/tests/cfg/insanity-local.sh
@@ -15,7 +15,7 @@ PTLDEBUG=${PTLDEBUG:-0x3f0400}
 SUBSYSTEM=${SUBSYSTEM:- 0xffb7e3ff}
 MOUNT=${MOUNT:-"/mnt/lustre"}
 #CLIENT_UPCALL=${CLIENT_UPCALL:-`pwd`/client-upcall-mdev.sh}
-UPCALL=${CLIENT_UPCALL:-`pwd`/replay-single-upcall.sh}
+UPCALL=${CLIENT_UPCALL:-"DEFAULT"}
 
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
 MDSSIZE=${MDSSIZE:-10000} #50000000
diff --git a/lustre/tests/cfg/insanity-ltest.sh b/lustre/tests/cfg/insanity-ltest.sh
new file mode 100644
index 0000000000..fe63e81015
--- /dev/null
+++ b/lustre/tests/cfg/insanity-ltest.sh
@@ -0,0 +1,75 @@
+#need to get the functions defined in the cluster's .sh configuration
+. $LTESTDIR/harness/config/$MACHINENAME/config.sh
+# comma_list and friends
+. $LTESTDIR/harness/config/common/utility_functions.sh
+
+all_but_one_clients() {
+    local n=0
+    local clients=""
+    for client in ${CLIENTS//,/ }; do
+        if [ $n -gt 0 ]; then
+            # don't include first client
+            clients="$clients $client"
+        fi
+        let n=n+1
+    done
+    echo $clients
+}
+
+# make sure client list is a comma separated list
+CLIENTS=`comma_list $CLIENTS`
+# could probably set this to $CLIENT1
+#FAIL_CLIENT=${CLIENT1}
+
+mds_HOST=${mds_HOST:-${MDSNODE1}}
+mdsfailover_HOST=${mdsfailover_HOST:-${MDSNODE2}}
+ost1_HOST=${ost1_HOST:-${OSTNODE1}}
+ost2_HOST=${ost2_HOST:-${OSTNODE2}}
+EXTRA_OSTS=${EXTRA_OSTS:-""}
+client_HOST=${CLIENT1}
+LIVE_CLIENT=${LIVE_CLIENT:-${CLIENT1}}
+# This should always be a list, not a regexp
+FAIL_CLIENTS=${FAIL_CLIENTS:-"`all_but_one_clients`"}
+
+NETTYPE=${NETTYPE:-${NETTYPE}}
+
+TIMEOUT=${TIMEOUT:-30}
+PTLDEBUG=${PTLDEBUG:-0}
+SUBSYSTEM=${SUBSYSTEM:-0}
+MOUNT=${MOUNT:-${MOUNTPT}}
+UPCALL=${CLIENT_UPCALL:-"${LUSTRE_TESTS}/replay-single-upcall.sh"}
+
+mdsdev1=${MDSDEV[1]:-$MDSDEVBASE}
+MDSDEV=${MDSDEV:-${mdsdev1}}
+
+# need to pull off the --size 
+if [ -n "$MDSSIZE" ]; then
+    MDSSIZE=`echo $MDSSIZE | awk '{print $2}'`
+else
+    MDSSIZE=100000
+fi
+MDSJOURNALSIZE=${MDSJOURNALSIZE:-0}
+
+ostdev1=${OSTDEV[1]:-$OSTDEVBASE}
+OSTDEV=${OSTDEV:-${ostdev1}}
+
+# need to pull off the --size 
+if [ -n "$OSTSIZE" ]; then
+    OSTSIZE=`echo $OSTSIZE | awk '{print $2}'`
+else
+    OSTSIZE=100000
+fi
+OSTJOURNALSIZE=${OSTJOURNALSIZE:-0}
+
+FSTYPE=${FSTYPE:-ext3}
+#STRIPE_BYTES=${STRIPE_BYTES:-65536} 
+STRIPE_BYTES=${STRIPE_BYTES:-1048576} 
+STRIPES_PER_OBJ=${STRIPES_PER_OBJ:-0}
+
+FAILURE_MODE=${FAILURE_MODE:-HARD} # or HARD
+#POWER_DOWN=${POWER_DOWN:-"powerman --off"}
+#POWER_UP=${POWER_UP:-"powerman --on"}
+POWER_UP=$POWER_ON
+POWER_DOWN=$POWER_OFF
+
+PDSH="${DSH}"
diff --git a/lustre/tests/cfg/insanity-mdev.sh b/lustre/tests/cfg/insanity-mdev.sh
index d3f0c6ed5a..c3b41d1801 100644
--- a/lustre/tests/cfg/insanity-mdev.sh
+++ b/lustre/tests/cfg/insanity-mdev.sh
@@ -6,22 +6,25 @@ EXTRA_OSTS=${EXTRA_OSTS:-mdev7}
 client_HOST=client
 LIVE_CLIENT=${LIVE_CLIENT:-mdev6}
 # This should always be a list, not a regexp
-#FAIL_CLIENTS=${FAIL_CLIENTS:-mdev7}
-FAIL_CLIENTS=${FAIL_CLIENTS:-""}
+FAIL_CLIENTS=${FAIL_CLIENTS:-mdev8}
+#FAIL_CLIENTS=${FAIL_CLIENTS:-""}
+
 
 NETTYPE=${NETTYPE:-tcp}
 
 TIMEOUT=${TIMEOUT:-30}
-PTLDEBUG=${PTLDEBUG:-0}
-SUBSYSTEM=${SUBSYSTEM:-0}
+PTLDEBUG=${PTLDEBUG:-0x3f0400}
+SUBSYSTEM=${SUBSYSTEM:- 0xffb7e3ff}
 MOUNT=${MOUNT:-"/mnt/lustre"}
 UPCALL=${CLIENT_UPCALL:-`pwd`/replay-single-upcall.sh}
 
 MDSDEV=${MDSDEV:-/dev/sda1}
 MDSSIZE=${MDSSIZE:-50000}
+MDSJOURNALSIZE=${MDSJOURNALSIZE:-0}
 
 OSTDEV=${OSTDEV:-$TMP/ost%d-`hostname`}
-OSTSIZE=${OSTSIZE:=50000}
+OSTSIZE=${OSTSIZE:=500000}
+OSTJOURNALSIZE=${OSTJOURNALSIZE:-0}
 FSTYPE=${FSTYPE:-ext3}
 STRIPE_BYTES=${STRIPE_BYTES:-1048576} 
 STRIPES_PER_OBJ=${STRIPES_PER_OBJ:-0}
diff --git a/lustre/tests/cfg/local.sh b/lustre/tests/cfg/local.sh
index 5072e7904c..e739ba1e5f 100644
--- a/lustre/tests/cfg/local.sh
+++ b/lustre/tests/cfg/local.sh
@@ -4,6 +4,8 @@ OSTNODE=${OSTNODE:-`hostname`}
 CLIENT=${CLIENT:-client}
 
 MDSCOUNT=1
+mds_HOST=${mds_HOST:-$MDSNODE}
+mdsfailover_HOST=${mdsfailover_HOST}
 mds1_HOST=${mds1_HOST:-$MDSNODE}
 mds1failover_HOST=${mds1failover_HOST}
 ost_HOST=${ost_HOST:-$OSTNODE}
@@ -26,7 +28,7 @@ OSTDEV=${OSTDEV:-$ROOT/tmp/ost1-`hostname`}
 OSTSIZE=${OSTSIZE:-50000}
 FSTYPE=${FSTYPE:-ext3}
 TIMEOUT=${TIMEOUT:-20}
-UPCALL=${UPCALL:-$PWD/replay-single-upcall.sh}
+UPCALL=${UPCALL:-DEFAULT}
 
 STRIPE_BYTES=${STRIPE_BYTES:-524288}
 STRIPES_PER_OBJ=${STRIPES_PER_OBJ:-0}
diff --git a/lustre/tests/compile.sh b/lustre/tests/compile.sh
index 6b5ccd980f..a3c6b7a48e 100644
--- a/lustre/tests/compile.sh
+++ b/lustre/tests/compile.sh
@@ -1,9 +1,10 @@
 #!/bin/sh
 set -evx
 
-MNT=${MNT:-/mnt/lustre}
-DIR=${DIR:-$MNT}
+MOUNT=${MOUNT:-/mnt/lustre}
+DIR=${DIR:-$MOUNT}
 SRC=${SRC:-`dirname $0`/../..}
+export CC=${CC:-gcc}
 while date; do
 	for i in lustre; do
 		TGT=$DIR/$i
diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh
index e59c7f0df8..0d8cbb1dd6 100644
--- a/lustre/tests/conf-sanity.sh
+++ b/lustre/tests/conf-sanity.sh
@@ -29,7 +29,7 @@ gen_config() {
 	add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES\
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
 	add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
-	add_client client --mds mds1_svc --lov lov1 --path $MOUNT
+	add_client client mds1 --lov lov1 --path $MOUNT
 }
 
 gen_second_config() {
@@ -43,11 +43,11 @@ gen_second_config() {
 }
 
 start_mds() {
-	echo "start mds service on `facet_active_host mds`"
+	echo "start mds1 service on `facet_active_host mds1`"
 	start mds1 --reformat $MDSLCONFARGS  || return 94
 }
 stop_mds() {
-	echo "stop mds service on `facet_active_host mds`"
+	echo "stop mds1 service on `facet_active_host mds1`"
 	stop mds1 $@  || return 97
 }
 
@@ -209,7 +209,7 @@ test_5b() {
 
 	[ -d $MOUNT ] || mkdir -p $MOUNT
 	$LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null
-	llmount $mds1_HOST://mds1_svc/client_facet $MOUNT  && exit 1
+	llmount $mds_HOST://mds1_svc/client_facet $MOUNT  && exit 1
 
 	# cleanup client modules
 	$LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null
@@ -218,7 +218,7 @@ test_5b() {
 	stop_mds || return 2
 	stop_ost || return 3
 
-	lsmod | grep -q portals && return 3
+	lsmod | grep -q portals && return 4 
 	return 0
 
 }
@@ -230,7 +230,7 @@ test_5c() {
 
 	[ -d $MOUNT ] || mkdir -p $MOUNT
 	$LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null
-	llmount $mds1_HOST://wrong_mds1_svc/client_facet $MOUNT  && exit 1
+        llmount $mds_HOST://wrong_mds1_svc/client_facet $MOUNT  && return 1
 
 	# cleanup client modules
 	$LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null
@@ -238,12 +238,33 @@ test_5c() {
 	stop_mds || return 2
 	stop_ost || return 3
 
-	lsmod | grep -q portals && return 3
+	lsmod | grep -q portals && return 4
 	return 0
 
 }
 run_test 5c "cleanup after failed mount (bug 2712)"
 
+test_5d() {
+       start_ost
+       start_mds
+       stop_ost --force
+
+       [ -d $MOUNT ] || mkdir -p $MOUNT
+       $LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null
+       llmount $mds_HOST://mds1_svc/client_facet $MOUNT  || return 1
+
+       umount $MOUNT || return 2
+       # cleanup client modules
+       $LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null
+
+       stop_mds || return 3
+
+       lsmod | grep -q portals && return 4
+       return 0
+
+}
+run_test 5d "ost down, don't crash during mount attempt"
+
 test_6() {
 	setup
 	manual_umount_client
@@ -379,13 +400,13 @@ test_11() {
         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
         add_ost ost --dev $OSTDEV --size $OSTSIZE
-        add_client client --mds mds1_svc --path $MOUNT --ost ost_svc || return $?
+        add_client client mds1 --path $MOUNT --ost ost_svc || return $?
         echo "Default lov config success!"
 
         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
         add_ost ost --dev $OSTDEV --size $OSTSIZE
-        add_client client --mds mds1_svc --path $MOUNT && return $?
+        add_client client mds1 --path $MOUNT && return $?
         echo "--add mtpt with neither --lov nor --ost will return error"
 
         echo ""
@@ -486,15 +507,14 @@ test_13() {
                        | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
         FOUNDMDS2UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '2p' \
                        | sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
-        if [ $EXPECTEDMDS1UUID != $FOUNDMDS1UUID ]; then
-                echo "Error:expected uuid for mds1: $EXPECTEDMDS1UUID; found: $FOUNDMDS1UUID"
-                return 1
-        fi
-        if [ $EXPECTEDMDS2UUID != $FOUNDMDS2UUID ]; then
-                echo "Error:expected uuid for mds2: $EXPECTEDMDS2UUID; found: $FOUNDMDS2UUID"
+        if ([ $EXPECTEDMDS1UUID = $FOUNDMDS1UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS2UUID ]) || \
+           ([ $EXPECTEDMDS1UUID = $FOUNDMDS2UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS1UUID ]); then
+                echo "Success:long uuid truncated successfully and being unique."
+        else
+                echo "Error:expected uuid for mds1 and mds2: $EXPECTEDMDS1UUID; $EXPECTEDMDS2UUID"
+                echo "but:     found uuid for mds1 and mds2: $FOUNDMDS1UUID; $FOUNDMDS2UUID"
                 return 1
         fi
-        echo "Success:long uuid truncated successfully and being unique."
 
         # check multiple invocations for lmc generate same XML configuration file
         rm -f $XMLCONFIG
@@ -527,7 +547,7 @@ test_14() {
             --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
         add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE \
             --mkfsoptions "-Llabel_conf_14"
-        add_client client --mds mds1_svc --lov lov1 --path $MOUNT
+        add_client client mds1 --lov lov1 --path $MOUNT
 
         FOUNDSTRING=`awk -F"<" '/<mkfsoptions>/{print $2}' $XMLCONFIG`
         EXPECTEDSTRING="mkfsoptions>-Llabel_conf_14"
diff --git a/lustre/tests/insanity.sh b/lustre/tests/insanity.sh
index 71ce414d56..0c3dc9a1da 100755
--- a/lustre/tests/insanity.sh
+++ b/lustre/tests/insanity.sh
@@ -12,6 +12,9 @@ init_test_env $@
 
 ALWAYS_EXCEPT="10"
 
+SETUP=${SETUP:-"setup"}
+CLEANUP=${CLEANUP:-"cleanup"}
+
 build_test_filter
 
 assert_env MDSCOUNT mds1_HOST ost1_HOST ost2_HOST client_HOST LIVE_CLIENT 
@@ -110,14 +113,14 @@ reintegrate_clients() {
 gen_config() {
     rm -f $XMLCONFIG
     if [ "$MDSCOUNT" -gt 1 ]; then
-        add_lmv lmv1
+        add_lmv lmv1_svc
         for mds in `mds_list`; do
             MDSDEV=$TMP/${mds}-`hostname`
-            add_mds $mds --dev $MDSDEV --size $MDSSIZE --lmv lmv1
+            add_mds $mds --dev $MDSDEV --size $MDSSIZE --lmv lmv1_svc
         done
-	MDS=lmv1
-        add_lov_to_lmv lov1 lmv1 --stripe_sz $STRIPE_BYTES \
+        add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
+	MDS=lmv1
     else
         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
         if [ ! -z "$mds1failover_HOST" ]; then
@@ -125,7 +128,7 @@ gen_config() {
         fi
 	add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
-	MDS=mds1_svc
+	MDS=mds1
     fi
 
     for i in `seq $NUMOST`; do
@@ -134,10 +137,12 @@ gen_config() {
 	    --journal-size $OSTJOURNALSIZE
     done
      
-    add_client client --mds $MDS --lov lov1 --path $MOUNT
+    add_client client $MDS --lov lov1 --path $MOUNT
 }
 
 setup() {
+    gen_config
+
     rm -rf logs/*
     for i in `seq $NUMOST`; do
 	wait_for ost$i
@@ -219,20 +224,17 @@ node_to_ost() {
 
 
 if [ "$ONLY" == "cleanup" ]; then
-    cleanup
+    $CLEANUP
     exit
 fi
 
-if [ -z "$NOSETUP" ]; then
-    gen_config
-    setup
-fi
-
 if [ ! -z "$EVAL" ]; then
     eval "$EVAL"
     exit $?
 fi
 
+$SETUP
+
 if [ "$ONLY" == "setup" ]; then
     exit 0
 fi
@@ -244,17 +246,17 @@ test_0() {
     echo "Failover MDS"
     facet_failover mds1
     echo "Waiting for df pid: $DFPID"
-    wait $DFPID || return 1
+    wait $DFPID || { echo "df returned $?" && return 1; }
 
     echo "Failing OST1"
     facet_failover ost1
     echo "Waiting for df pid: $DFPID"
-    wait $DFPID || return 2
-
+    wait $DFPID || { echo "df returned $?" && return 2; }
+    
     echo "Failing OST2"
     facet_failover ost2
     echo "Waiting for df pid: $DFPID"
-    wait $DFPID || return 3
+    wait $DFPID || { echo "df returned $?" && return 3; }
     return 0
 }
 run_test 0 "Fail all nodes, independently"
@@ -629,4 +631,4 @@ test_10() {
 run_test 10 "Running Availability for 6 hours..."
 
 equals_msg "Done, cleaning up"
-cleanup
+$CLEANUP
diff --git a/lustre/tests/lfsck_config.sh b/lustre/tests/lfsck_config.sh
index 8f1173e3cd..e0a61deeb3 100755
--- a/lustre/tests/lfsck_config.sh
+++ b/lustre/tests/lfsck_config.sh
@@ -12,7 +12,7 @@ MDSSIZE=${MDSSIZE:-100000}
 FSTYPE=${FSTYPE:-ext3}
 MOUNT=${MOUNT:-/mnt/lustre}
 #MOUNT2=${MOUNT2:-${MOUNT}2}
-NETWORKTYPE=${NETWORKTYPE:-tcp}
+NETTYPE=${NETTYPE:-tcp}
 
 OSTSIZE=${OSTSIZE:-200000}
 
@@ -28,7 +28,7 @@ rm -f $config
 
 # create nodes
 ${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid `hostname` --nettype $NETWORKTYPE || exit 11
+${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
 
 # configure mds server
 ${LMC} --add mds --nspath /mnt/mds_ns  --node localhost --mds mds1 --fstype $FSTYPE --dev $MDSDEV --size $MDSSIZE $JARG --mkfsoptions "-I $MDSISIZE" || exit 20
diff --git a/lustre/tests/lfscktest.sh b/lustre/tests/lfscktest.sh
index 4c9fed0b02..b49752144c 100755
--- a/lustre/tests/lfscktest.sh
+++ b/lustre/tests/lfscktest.sh
@@ -11,7 +11,9 @@ mkdir -p $OST_MOUNTPT
 mkdir -p $MDS_MOUNTPT
 mkdir -p $TEST_DIR
 
-export PATH=$E2FSCK_PATH/e2fsck:$PATH
+export PATH=$LFSCK_PATH/e2fsck:`dirname $0`:`dirname $0`/../utils:$PATH
+
+sh llmount.sh || exit 1
 
 # Create some files on the filesystem
 for i in `seq 0 3`; do
@@ -67,13 +69,12 @@ for i in `seq 20 39`; do
 	MDS_FILES="$MDS_FILES ${TESTNAME}/${file_name}.$i"
 done
 
-$LCONF --cleanup ${CONFIGXML} || exit 1
-
+sh llmountcleanup.sh || exit 1
 # Remove objects associated with files
 echo "removing objects: $OST_TEST_FILE_OBJIDS"
 for i in $OST_TEST_FILE_OBJIDS; do
 	z=`expr $i % 32`
-	$DEBUGFS -w -R "rm O/0/d$z/$i" "$OSTDEV" || exit 1
+	debugfs -w -R "rm O/0/d$z/$i" "$OSTDEV" || exit 1
 done
 
 mount "-o" loop $MDSDEV $MDS_MOUNTPT
@@ -86,8 +87,8 @@ done
 #Create EAs on files so objects are referenced twice from different mds files
 for i in `seq 40 59`; do
 	touch $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.bad.$i
-	${GPATH}/copy_attr $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.$i $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.bad.$i || (umount $MDS_MOUNTPT && exit 1) 
-	i=`expr $i + 1`
+	copy_attr $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.$i $MDS_MOUNTPT/ROOT/${TESTNAME}/${TESTNAME}.bad.$i || (umount $MDS_MOUNTPT && exit 1)
+        i=`expr $i + 1`
 done
 	umount $MDS_MOUNTPT 
 	rmdir $MDS_MOUNTPT
@@ -113,11 +114,12 @@ while [ $i -lt $NUM_OSTS ]; do
 	i=`expr $i + 1`
 done
 
-#Mount filesystem
-${LCONF} ${CONFIGXML}  || exit 1
+#Remount filesystem
+sh llrmount.sh  || exit 1
 
 lfsck -l --mdsdb $GPATH/mdsdb --ostdb ${OSTDB_LIST} ${MOUNT} || exit 1  
 
 #Cleanup 
 rm $GPATH/mdsdb
 rm $GPATH/ostdb-*
+sh llmountcleanup.sh || exit 1
diff --git a/lustre/tests/lfscktest_config.sh b/lustre/tests/lfscktest_config.sh
index 45746b2e8e..6bae2bc5ab 100644
--- a/lustre/tests/lfscktest_config.sh
+++ b/lustre/tests/lfscktest_config.sh
@@ -1,31 +1,10 @@
 export TESTNAME="lfscktest"
 export TESTDESC="Test of lfsck functionality"
 
-export LUSTRE=${LUSTRE:-"../.."}
-export LCONF=${LCONF:-"$LUSTRE/utils/lconf"}
-export LMC=${LMC:-"$LUSTRE/utils/lmc"}
-export LCTL=${LCTL:-"$LUSTRE/utils/lctl"}
-export LFIND=${LFIND:-"$LUSTRE/utils/lfind"}
-export E2FSCK_PATH=${E2FSCK_PATH:-"/usr/src/e2fsprogs-1.34"}
+export LFSCK_PATH=${E2FSCK_PATH:-"/usr/src/e2fsprogs-1.34"}
 export TMP=${TMP:-"/tmp"}
-export CONFIG=${CONFIG:-"./lfsck_config.sh"}
 export LOG=${LOG:-"${TMP}/lfscktest.log"}
-export CONFIGXML=${CONFIGXML:-"./lfsck_config.xml"}
 export LUSTRE_TAG=${LUSTRE_TAG:="HEAD"}
-export MACHINENAME=`hostname | sed -e 's/[0-9]\+//'`
-export TESTGROUP=${TESTGROUP:-"unspecified"}
-export CONFIGDESC=${CONFIGDESC:-"local"}
-export TESTARCH=${TESTARCH:-`uname -m`}
-export NETWORKTYPE=${NETWORKTYPE:-"tcp"}
-export MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
-export MDSNODES=${MDSNODES:-`hostname`}
-export OSTDEV=${OSTDEV:-$TMP/ost1-`hostname`}
-export OSTNODES=${OSTNODES:-`hostname`}
-export CLIENTNODES=${CLIENTNODES:-`hostname`}
-export RECIPIENTS=${RECIPIENTS:-"liam.kelleher@hp.com"}
-export SENDER=${SENDER:-"liam.kelleher@hp.com"}
-export NUM_OSTS=${NUM_OSTS:-5}
-export DEBUGFS=${DEBUGFS:-"debugfs"}
 
 export GPATH=`pwd`
 export OST_UUID="OST_localhost_2_UUID"
diff --git a/lustre/tests/llmount.sh b/lustre/tests/llmount.sh
index d8d243bd90..5a8c205cd4 100755
--- a/lustre/tests/llmount.sh
+++ b/lustre/tests/llmount.sh
@@ -5,6 +5,7 @@ export PATH=`dirname $0`/../utils:$PATH
 
 LCONF=${LCONF:-lconf}
 NAME=${NAME:-local}
+LLMOUNT=${LLMOUNT:-llmount}
 
 config=$NAME.xml
 mkconfig=$NAME.sh
@@ -28,3 +29,8 @@ fi
 
 ${LCONF} $NOMOD $portals_opt $lustre_opt $node_opt ${REFORMAT:---reformat} $@ \
 	$conf_opt  || exit 2
+
+if [ "$MOUNT2" ]; then
+       $LLMOUNT -v `hostname`:/mds1/client $MOUNT2 || exit 3
+fi
+
diff --git a/lustre/tests/llmountcleanup.sh b/lustre/tests/llmountcleanup.sh
index 35eca9b40d..05ac8a4f54 100755
--- a/lustre/tests/llmountcleanup.sh
+++ b/lustre/tests/llmountcleanup.sh
@@ -29,6 +29,9 @@ fi
 [ "$NODE" ] && node_opt="--node $NODE"
 
 sync; sleep 2; sync
+
+[ "$MOUNT2" ] && umount $MOUNT2
+
 ${LCONF} $NOMOD $portals_opt $lustre_opt $node_opt --cleanup $@ \
     --dump $TMP/debug $conf_opt
 rc=$?
diff --git a/lustre/tests/llrmount.sh b/lustre/tests/llrmount.sh
index 5aa8601ed1..9a5cbfa52a 100755
--- a/lustre/tests/llrmount.sh
+++ b/lustre/tests/llrmount.sh
@@ -4,6 +4,7 @@ export PATH=`dirname $0`/../utils:$PATH
 
 LCONF=${LCONF:-lconf}
 NAME=${NAME:-local}
+LLMOUNT=${LLMOUNT:-llmount}
 
 config=$NAME.xml
 mkconfig=$NAME.sh
@@ -28,3 +29,8 @@ fi
 [ "$NODE" ] && node_opt="--node $NODE"
 
 ${LCONF} $NOMOD $portals_opt $lustre_opt $node_opt $@ $conf_opt || exit 2
+
+if [ "$MOUNT2" ]; then
+       $LLMOUNT -v `hostname`:/mds1/client $MOUNT2 || exit 3
+fi
+
diff --git a/lustre/tests/local.sh b/lustre/tests/local.sh
index 12e305dd6c..f3d7d2e630 100755
--- a/lustre/tests/local.sh
+++ b/lustre/tests/local.sh
@@ -8,14 +8,16 @@ LMC="${LMC:-lmc} -m $config"
 TMP=${TMP:-/tmp}
 
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
-MDSSIZE=${MDSSIZE:-100000}
+
+MDSSIZE=${MDSSIZE:-400000}
 FSTYPE=${FSTYPE:-ext3}
+
 MOUNT=${MOUNT:-/mnt/lustre}
 MOUNT2=${MOUNT2:-${MOUNT}2}
-NETWORKTYPE=${NETWORKTYPE:-tcp}
+NETTYPE=${NETTYPE:-tcp}
 
 OSTDEV=${OSTDEV:-$TMP/ost1-`hostname`}
-OSTSIZE=${OSTSIZE:-200000}
+OSTSIZE=${OSTSIZE:-400000}
 
 MDS_BACKFSTYPE=${MDS_BACKFSTYPE:-ext3}
 OST_BACKFSTYPE=${OST_BACKFSTYPE:-ext3}
@@ -36,8 +38,8 @@ rm -f $config
 
 # create nodes
 ${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node localhost --nid `hostname` --nettype $NETWORKTYPE || exit 11
-${LMC} --add net --node client --nid '*' --nettype $NETWORKTYPE || exit 12
+${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
+${LMC} --add net --node client --nid '*' --nettype $NETTYPE || exit 12
 
 
 [ "x$MDS_MOUNT_OPTS" != "x" ] &&
diff --git a/lustre/tests/lockorder.sh b/lustre/tests/lockorder.sh
index cf5051b527..5134a2dd71 100644
--- a/lustre/tests/lockorder.sh
+++ b/lustre/tests/lockorder.sh
@@ -46,7 +46,7 @@ while [ $MINRES -gt $MAXRES ]; do
 		MINFILE=$FILETMP
 		MINRES=$FILERES
 	else
-		rm $TMPFILE
+		rm $FILETMP
 	fi
 	NUM=$(($NUM + 1))
 done
@@ -60,7 +60,9 @@ $LCTL mark "start dir: $LOCKDIR=$MAXRES file: $LOCKFILE=$MINRES"
 $CREATEMANY -l$LOCKFILE $LOCKFILE -$COUNT &
 CR_PID=$!
 
-sleep 1
+while ! test -f ${LOCKFILE}1 ; do
+       sleep 1
+done
 
 # this will lock $DIR and ${LOCKFILE}0
 $STATMANY -s $DIR2/lockdir/lockfile 1 -$COUNT &
diff --git a/lustre/tests/lov.sh b/lustre/tests/lov.sh
index d148f20506..b302b80a94 100755
--- a/lustre/tests/lov.sh
+++ b/lustre/tests/lov.sh
@@ -10,11 +10,11 @@ LMC="${LMC:-lmc} -m $config"
 TMP=${TMP:-/tmp}
 
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
-MDSSIZE=${MDSSIZE:-100000}
+MDSSIZE=${MDSSIZE:-400000}
 FSTYPE=${FSTYPE:-ext3}
 MOUNT=${MOUNT:-/mnt/lustre}
 MOUNT2=${MOUNT2:-${MOUNT}2}
-NETWORKTYPE=${NETWORKTYPE:-tcp}
+NETTYPE=${NETTYPE:-tcp}
 
 OSTCOUNT=${OSTCOUNT:-5}
 # OSTDEVN will still override the device for OST N
@@ -35,8 +35,9 @@ rm -f $config
 
 # create nodes
 ${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid `hostname` --nettype $NETWORKTYPE || exit 11
-${LMC} --add net --node client --nid '*' --nettype $NETWORKTYPE || exit 12
+${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
+${LMC} --add net --node client --nid '*' --nettype $NETTYPE || exit 12
+
 
 # configure mds server
 ${LMC} --format --add mds --node localhost --mds mds1 --fstype $FSTYPE --dev $MDSDEV --size $MDSSIZE || exit 20
diff --git a/lustre/tests/memhog.c b/lustre/tests/memhog.c
new file mode 100644
index 0000000000..098e7873a5
--- /dev/null
+++ b/lustre/tests/memhog.c
@@ -0,0 +1,102 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CHUNK (128 * 1024)
+
+void usage(const char *prog, FILE *out)
+{
+	fprintf(out, "usage: %s allocsize\n", prog);
+	fprintf(out, " allocsize is kbytes, or number[KMGP] (P = pages)\n");
+	exit(out == stderr);
+}
+
+int main(int argc, char *argv[])
+{
+	long long kbtotal = 0, kballoc;
+	int i, j, k, numchunk, alloc, sum, rc = 0;
+	char **mem, *tmp;
+
+	if (argc == 2) {
+		char *end = NULL;
+		kbtotal = strtoull(argv[1], &end, 0);
+
+		switch(*end) {
+		case 'g':
+		case 'G':
+			kbtotal *= 1024;
+		case 'm':
+		case 'M':
+			kbtotal *= 1024;
+		case '\0':
+		case 'k':
+		case 'K':
+			break;
+		case 'p':
+		case 'P':
+			kbtotal *= 4;
+			break;
+		default:
+			usage(argv[0], stderr);
+			break;
+		}
+	}
+
+	if (argc != 2 || kbtotal == 0)
+		usage(argv[0], stderr);
+
+	numchunk = (kbtotal + CHUNK - 1) / CHUNK;
+	mem = calloc(numchunk, sizeof(*mem));
+	if (mem == NULL) {
+		fprintf(stderr, "error allocating initial chunk array\n");
+		exit(1);
+	}
+
+	alloc = CHUNK;
+	printf("[%d] allocating %lld kbytes in %u kbyte chunks\n",
+	       getpid(), kbtotal, alloc);
+	for (i = kballoc = 0; i < numchunk; i++, kballoc += alloc) {
+		if (kbtotal - kballoc < alloc)
+			alloc = kbtotal - kballoc;
+
+		tmp = mem[i] = malloc(alloc * 1024);
+		if (tmp == NULL) {
+			fprintf(stderr, "malloc(%u) failed (%lld/%lld)\n",
+				alloc * 1024, kballoc, kbtotal);
+		} else {
+			printf("touching %p (%lld/%lld)\n",
+			       tmp, kballoc, kbtotal);
+			for (j = 0; j < alloc; j += 4) {
+				for (k = 0, sum = 0; k < 4095; k++, tmp++)
+					sum += *tmp;
+				*tmp = sum;
+			}
+		}
+	}
+	printf("touched %lld kbytes\n", kballoc);
+
+	alloc = CHUNK;
+	printf("verifying %lld kbytes in %u kbyte chunks\n", kbtotal, alloc);
+	for (i = kballoc = 0; i < numchunk; i++, kballoc += alloc) {
+		if (kbtotal - kballoc < alloc)
+			alloc = kbtotal - kballoc;
+
+		tmp = mem[i];
+		if (tmp != NULL) {
+			printf("verifying %p (%lld/%lld)\n",
+			       tmp, kballoc, kbtotal);
+			for (j = 0; j < alloc; j += 4) {
+				for (k = 0, sum = 0; k < 4095; k++, tmp++)
+					sum += *tmp;
+				if (*tmp != sum) {
+					fprintf(stderr, "sum %x != %x at %p\n",
+						*tmp, sum, tmp - 4092);
+					rc = 1;
+				}
+			}
+		}
+	}
+	printf("verified %lld kbytes\n", kballoc);
+	return rc;
+}
diff --git a/lustre/tests/mmap_sanity.c b/lustre/tests/mmap_sanity.c
new file mode 100644
index 0000000000..6938b1b624
--- /dev/null
+++ b/lustre/tests/mmap_sanity.c
@@ -0,0 +1,650 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ */
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+
+char *dir = NULL, *node = NULL, *dir2 = NULL;
+long page_size;
+char mmap_sanity[256];
+
+
+static void usage(void)
+{
+        printf("Usage: mmap_sanity -d dir [-n node | -m dir2]\n");
+        printf("       dir      lustre mount point\n");
+        printf("       node     another client\n");
+        printf("       dir2     another mount point\n");
+        exit(127);
+}
+
+#define MMAP_NOTIFY_PORT        7676
+static int mmap_notify(char *target, char *str, int delay)
+{
+	unsigned short port = MMAP_NOTIFY_PORT;
+	int socket_type = SOCK_DGRAM;
+	struct sockaddr_in server;
+	struct hostent *hp;
+	int len, sockfd, rc = 0;
+
+        if (target == NULL)
+                return 0;
+
+	sockfd = socket(AF_INET, socket_type, 0);
+	if (sockfd < 0) {
+                perror("socket()");
+		return errno;
+	}
+
+        if ((hp = gethostbyname(target)) == NULL) {
+                perror(target);
+                rc = errno;
+                goto out_close;
+	}
+
+	memset(&server,0,sizeof(server));
+	memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
+	server.sin_family = AF_INET;
+	server.sin_port = htons(port);
+        
+        len = sizeof(server);
+        if (delay)
+                sleep(delay);
+        
+        rc = sendto(sockfd, str, strlen(str), 0, 
+                    (struct sockaddr *)&server, len);
+        if (rc < 0) {
+                perror("sendto()");
+                rc = errno;
+        } else
+                rc = 0;
+
+out_close:
+        close(sockfd);
+        return rc;
+}
+
+static int mmap_wait(char *str, int timeout)
+{
+	unsigned short port = MMAP_NOTIFY_PORT;
+	int socket_type = SOCK_DGRAM;
+	struct sockaddr_in local, from;
+	char host[256];
+	struct hostent *hp;
+        fd_set rfds;
+        struct timeval tv;
+        int sockfd, rc = 0;
+
+        if (dir2 != NULL)
+                return 0;
+        
+	memset(host, 0, sizeof(host));
+	if (gethostname(host, sizeof(host))) {
+                perror("gethostname()");
+                return errno;
+	}
+        
+	if ((hp = gethostbyname(host)) == NULL) {
+                perror(host);
+                return errno;
+	}
+
+	local.sin_family = AF_INET;
+	memcpy(&(local.sin_addr), hp->h_addr, hp->h_length);
+	local.sin_port = htons(port);
+	
+	sockfd = socket(AF_INET, socket_type, 0);
+	if (sockfd < 0) {
+                perror("socket()");
+		return errno;
+	}
+
+	rc = bind(sockfd, (struct sockaddr *)&local, sizeof(local));
+        if (rc < 0) {
+                perror("bind()");
+                rc = errno;
+                goto out_close;
+	}
+
+        FD_ZERO(&rfds);
+        FD_SET(sockfd, &rfds);
+        tv.tv_sec = timeout ? timeout : 5;
+        tv.tv_usec = 0;
+
+        rc = select(sockfd + 1, &rfds, NULL, NULL, &tv);
+        if (rc) {       /* got data */
+                char buffer[1024];
+                int fromlen =sizeof(from);
+                
+		memset(buffer, 0, sizeof(buffer));
+		rc = recvfrom(sockfd, buffer, sizeof(buffer), 0, 
+                              (struct sockaddr *)&from, &fromlen);
+                if (rc <= 0) {
+                        perror("recvfrom()");
+                        rc = errno;
+                        goto out_close;
+                }
+                rc = 0;
+
+                if (strncmp(str, buffer, strlen(str)) != 0) {
+                        fprintf(stderr, "expected string mismatch!\n");
+                        rc = EINVAL;
+                }
+        } else {        /* timeout */
+                fprintf(stderr, "timeout!\n");
+                rc = ETIME;
+        }
+
+out_close:
+        close(sockfd);
+        return rc;
+}
+
+static int remote_tst(int tc, char *mnt);
+static int mmap_run(char *host, int tc)
+{
+        pid_t child;
+        char nodearg[256], command[256];
+        int rc = 0;
+
+        child = fork();
+        if (child < 0)
+                return errno;
+        else if (child)
+                return 0;
+
+        if (dir2 != NULL) {
+                rc = remote_tst(tc, dir2);
+        } else {
+                sprintf(nodearg, "-w %s", node);
+                sprintf(command, "%s -d %s -n %s -c %d", 
+                        mmap_sanity, dir, host, tc);
+                rc = execlp("pdsh", "pdsh", "-S", nodearg, command, NULL);
+                if (rc)
+                        perror("execlp()");
+        }
+        _exit(rc);
+}
+
+static int mmap_initialize(char *myself, int tc)
+{
+        char buf[1024], *file;
+        int fdr, fdw, count, rc = 0;
+        
+        page_size = sysconf(_SC_PAGESIZE);
+        if (page_size == -1) {
+                perror("sysconf(_SC_PAGESIZE)");
+                return errno;
+        }
+        if (tc)
+                return 0;
+
+        /* copy myself to lustre for another client */
+        fdr = open(myself, O_RDONLY);
+        if (fdr < 0) {
+                perror(myself);
+                return EINVAL;
+        }
+        file = strrchr(myself, '/');
+        if (file == NULL) {
+                fprintf(stderr, "can't get test filename\n");
+                close(fdr);
+                return EINVAL;
+        }
+        file++;
+        sprintf(mmap_sanity, "%s/%s", dir, file);
+
+        fdw = open(mmap_sanity, O_CREAT|O_WRONLY, 0777);
+        if (fdw < 0) {
+                perror(mmap_sanity);
+                close(fdr);
+                return EINVAL;
+        }
+        while ((count = read(fdr, buf, sizeof(buf))) != 0) {
+                int writes;
+
+                if (count < 0) {
+                        perror("read()");
+                        rc = errno;
+                        break;
+                }
+                writes = write(fdw, buf, count);
+                if (writes != count) {
+                        perror("write()");
+                        rc = errno;
+                        break;
+                }
+        }
+        close(fdr);
+        close(fdw);
+        return rc;
+}
+
+static void mmap_finalize(int tc)
+{
+        if (tc)
+                return;
+        unlink(mmap_sanity);
+}
+
+/* basic mmap operation on single node */
+static int mmap_tst1(char *mnt)
+{
+        char *ptr, mmap_file[256];
+        int i, j, region, fd, rc = 0;
+
+        region = page_size * 10;
+        sprintf(mmap_file, "%s/%s", mnt, "mmap_file1");
+        
+        if (unlink(mmap_file) && errno != ENOENT) {
+                perror("unlink()");
+                return errno;
+        }
+
+        fd = open(mmap_file, O_CREAT|O_RDWR, 0600);
+        if (fd < 0) {
+                perror(mmap_file);
+                return errno;
+        }
+        ftruncate(fd, region);
+
+        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+        memset(ptr, 'a', region);
+
+        /* mem write then sync */
+        for (i = 0; i < 5; i++) {
+                for (j = 0; j < region; j += page_size)
+                        ptr[j] = i;
+                sync();
+        }
+
+        munmap(ptr, region);
+out_close:
+        close(fd);
+        unlink(mmap_file);
+        return rc;
+}
+
+/* MAP_PRIVATE create a copy-on-write mmap */
+static int mmap_tst2(char *mnt)
+{
+        char *ptr, mmap_file[256], buf[256];
+        int fd, rc = 0;
+
+        sprintf(mmap_file, "%s/%s", mnt, "mmap_file2");
+
+        if (unlink(mmap_file) && errno != ENOENT) {
+                perror("unlink()");
+                return errno;
+        }
+
+        fd = open(mmap_file, O_CREAT|O_RDWR, 0600);
+        if (fd < 0) {
+                perror(mmap_file);
+                return errno;
+        }
+        ftruncate(fd, page_size);
+
+        ptr = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+        memcpy(ptr, "blah", strlen("blah"));
+
+        munmap(ptr, page_size);
+out_close:
+        close(fd);
+        if (rc)
+                return rc;
+
+        fd = open(mmap_file, O_RDONLY);
+        if (fd < 0) {
+                perror(mmap_file);
+                return errno;
+        }
+        rc = read(fd, buf, sizeof(buf));
+        if (rc < 0) {
+                perror("read()");
+                rc = errno;
+                goto out_close;
+        }
+        rc = 0;
+        
+        if (strncmp("blah", buf, strlen("blah")) == 0) {
+                fprintf(stderr, "mmap write back with MAP_PRIVATE!\n");
+                rc = EFAULT;
+        }
+        close(fd);
+        unlink(mmap_file);
+        return rc;
+}
+
+/* cocurrent mmap operations on two nodes */
+static int mmap_tst3(char *mnt)
+{
+        char *ptr, mmap_file[256], host[256];
+        int region, fd, rc = 0;
+
+        region = page_size * 100;
+        sprintf(mmap_file, "%s/%s", mnt, "mmap_file3");
+        
+        if (unlink(mmap_file) && errno != ENOENT) {
+                perror("unlink()");
+                return errno;
+        }
+
+        fd = open(mmap_file, O_CREAT|O_RDWR, 0600);
+        if (fd < 0) {
+                perror(mmap_file);
+                return errno;
+        }
+        ftruncate(fd, region);
+
+        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+
+        if (gethostname(host, sizeof(host))) {
+                perror("gethostname()");
+                rc = errno;
+                goto out_unmap;
+	}
+        
+        rc = mmap_run(host, 3);
+        if (rc)
+                goto out_unmap;
+        
+        rc = mmap_wait("mmap done", 10);
+        memset(ptr, 'a', region);
+
+        sleep(2);       /* wait for remote test finish */
+out_unmap:
+        munmap(ptr, region);
+out_close:
+        close(fd);
+        unlink(mmap_file);
+        return rc;
+}       
+
+static int remote_tst3(char *mnt)
+{
+        char *ptr, mmap_file[256];
+        int region, fd, rc = 0;
+
+        region = page_size * 100;
+        sprintf(mmap_file, "%s/%s", mnt, "mmap_file3");
+
+        fd = open(mmap_file, O_RDWR, 0600);
+        if (fd < 0) {
+                perror(mmap_file);
+                return errno;
+        }
+
+        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+        memset(ptr, 'b', region);
+
+        rc = mmap_notify(node, "mmap done", 1);
+        if (rc)
+                goto out_unmap;
+        
+        memset(ptr, 'c', region);
+        
+out_unmap:
+        munmap(ptr, region);
+out_close:
+        close(fd);
+        return rc;
+}
+
+/* client1 write to file_4a from mmap()ed file_4b;
+ * client2 write to file_4b from mmap()ed file_4a. */
+static int mmap_tst4(char *mnt)
+{
+        char *ptr, filea[256], fileb[256], host[256];
+        int region, fdr, fdw, rc = 0;
+
+        region = page_size * 100;
+        sprintf(filea, "%s/%s", mnt, "mmap_file_4a");
+        sprintf(fileb, "%s/%s", mnt, "mmap_file_4b");
+
+        if (unlink(filea) && errno != ENOENT) {
+                perror("unlink()");
+                return errno;
+        }
+        if (unlink(fileb) && errno != ENOENT) {
+                perror("unlink()");
+                return errno;
+        }
+
+        fdr = fdw = -1;
+        fdr = open(fileb, O_CREAT|O_RDWR, 0600);
+        if (fdr < 0) {
+                perror(fileb);
+                return errno;
+        }
+        ftruncate(fdr, region);
+        fdw = open(filea, O_CREAT|O_RDWR, 0600);
+        if (fdw < 0) {
+                perror(filea);
+                rc = errno;
+                goto out_close;
+        }
+        ftruncate(fdw, region);
+        
+        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fdr, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+
+        if (gethostname(host, sizeof(host))) {
+                perror("gethostname()");
+                rc = errno;
+                goto out_unmap;
+	}
+        
+        rc = mmap_run(host, 4);
+        if (rc)
+                goto out_unmap;
+        
+        rc = mmap_wait("mmap done", 10);
+        if (rc)
+                goto out_unmap;
+        
+        memset(ptr, '1', region);
+        
+        rc = write(fdw, ptr, region);
+        if (rc <= 0) {
+                perror("write()");
+                rc = errno;
+        } else
+                rc = 0;
+
+        sleep(2);       /* wait for remote test finish */
+out_unmap:
+        munmap(ptr, region);
+out_close:
+        if (fdr >= 0)
+                close(fdr);
+        if (fdw >= 0)
+                close(fdw);
+        unlink(filea);
+        unlink(fileb);
+        return rc;
+}
+
+static int remote_tst4(char *mnt)
+{
+        char *ptr, filea[256], fileb[256];
+        int region, fdr, fdw, rc = 0;
+
+        region = page_size * 100;
+        sprintf(filea, "%s/%s", mnt, "mmap_file_4a");
+        sprintf(fileb, "%s/%s", mnt, "mmap_file_4b");
+
+        fdr = fdw = -1;
+        fdr = open(filea, O_RDWR, 0600);
+        if (fdr < 0) {
+                perror(filea);
+                return errno;
+        }
+        fdw = open(fileb, O_RDWR, 0600);
+        if (fdw < 0) {
+                perror(fileb);
+                rc = errno;
+                goto out_close;
+        }
+
+        ptr = mmap(NULL, region, PROT_READ|PROT_WRITE, MAP_SHARED, fdr, 0);
+        if (ptr == MAP_FAILED) {
+                perror("mmap()");
+                rc = errno;
+                goto out_close;
+        }
+
+        rc = mmap_notify(node, "mmap done", 1);
+        if (rc)
+                goto out_unmap;
+
+        memset(ptr, '2', region);
+
+        rc = write(fdw, ptr, region);
+        if (rc <= 0) {
+                perror("write()");
+                rc = errno;
+        } else
+                rc = 0;
+     
+out_unmap:
+        munmap(ptr, region);
+out_close:
+        if (fdr >= 0)
+                close(fdr);
+        if (fdw >= 0)
+                close(fdw);
+        return rc;
+}
+
+static int remote_tst(int tc, char *mnt)
+{
+        int rc = 0;
+        switch(tc) {
+        case 3:
+                rc = remote_tst3(mnt);
+                break;
+        case 4:
+                rc = remote_tst4(mnt);
+                break;
+        case 1:
+        case 2:
+        default:
+                fprintf(stderr, "wrong test case number %d\n", tc);
+                rc = EINVAL;
+                break;
+        }
+        return rc;
+}
+        
+struct test_case {
+        int     tc;                     /* test case number */
+        char    *desc;                  /* test description */
+        int     (* test_fn)(char *mnt); /* test function */
+        int     node_cnt;               /* node count */
+};
+
+struct test_case tests[] = {
+        { 1, "mmap test1: basic mmap operation", mmap_tst1, 1 },
+        { 2, "mmap test2: MAP_PRIVATE not write back", mmap_tst2, 1 },
+        { 3, "mmap test3: cocurrent mmap ops on two nodes", mmap_tst3, 2 },
+        { 4, "mmap test4: c1 write to f1 from mmaped f2, " 
+             "c2 write to f1 from mmaped f1", mmap_tst4, 2 },
+        { 0, NULL, 0, 0 }
+};
+
+int main(int argc, char **argv)
+{
+        extern char *optarg;
+        struct test_case *test;
+        int c, rc = 0, tc = 0;
+
+        for(;;) {
+                c = getopt(argc, argv, "d:n:c:m:");
+                if ( c == -1 )
+                        break;
+
+                switch(c) {
+                        case 'd':
+                                dir = optarg;
+                                break;
+                        case 'n':
+                                node = optarg;
+                                break;
+                        case 'c':
+                                tc = atoi(optarg);
+                                break;
+                        case 'm':
+                                dir2 = optarg;
+                                break;
+                        default:
+                        case '?':
+                                usage();
+                                break;
+                }
+        }
+
+        if (dir == NULL)
+                usage();
+        if (dir2 != NULL && node != NULL)
+                usage();
+
+        if (mmap_initialize(argv[0], tc) != 0) {
+                fprintf(stderr, "mmap_initialize failed!\n");
+                return EINVAL;
+        }
+
+        if (tc) {
+                rc = remote_tst(tc, dir);
+                goto out;
+        }
+        
+        for (test = tests; test->tc; test++) {
+                char *rs = "skip";
+                rc = 0;
+                if (test->node_cnt == 1 || node != NULL || dir2 != NULL) {
+                        rc = test->test_fn(dir);
+                        rs = rc ? "fail" : "pass";
+                }
+                fprintf(stderr, "%s (%s)\n", test->desc, rs);
+                if (rc)
+                        break;
+        }
+out:
+        mmap_finalize(tc);
+        return rc;
+}
diff --git a/lustre/tests/multiop.c b/lustre/tests/multiop.c
index 7ab0208a12..776eaeac6b 100755
--- a/lustre/tests/multiop.c
+++ b/lustre/tests/multiop.c
@@ -96,7 +96,8 @@ int main(int argc, char **argv)
                         }
                         break;
                 case 'D':
-                        if (open(fname, O_DIRECTORY) == -1) {
+                        fd = open(fname, O_DIRECTORY);
+                        if (fd == -1) {
                                 perror("open(O_DIRECTORY)");
                                 exit(1);
                         }
diff --git a/lustre/tests/recovery-cleanup.sh b/lustre/tests/recovery-cleanup.sh
index 77b5646a05..114b4f9946 100755
--- a/lustre/tests/recovery-cleanup.sh
+++ b/lustre/tests/recovery-cleanup.sh
@@ -19,7 +19,7 @@ PDSH='pdsh -S -w'
 MDSNODE=${MDSNODE:-mdev6}
 OSTNODE=${OSTNODE:-mdev7}
 CLIENT=${CLIENT:-mdev8}
-NETWORKTYPE=${NETWORKTYPE:-tcp}
+NETTYPE=${NETTYPE:-tcp}
 MOUNTPT=${MOUNTPT:-/mnt/lustre}
 CONFIG=${CONFIG:-recovery-cleanup.xml}
 MDSDEV=${MDSDEV:-/tmp/mds1-`hostname`}
@@ -50,8 +50,8 @@ drop_request() {
 make_config() {
     rm -f $CONFIG
     for NODE in $CLIENT $MDSNODE $OSTNODE; do
-       lmc -m $CONFIG --add net --node $NODE --nid `h2$NETWORKTYPE $NODE` \
-           --nettype $NETWORKTYPE || exit 4
+       lmc -m $CONFIG --add net --node $NODE --nid `h2$NETTYPE $NODE` \
+           --nettype $NETTYPE || exit 4
     done
     lmc -m $CONFIG --add mds --node $MDSNODE --mds mds1 --fstype $FSTYPE \
     	--dev $MDSDEV --size $MDSSIZE || exit 5
diff --git a/lustre/tests/recovery-small.sh b/lustre/tests/recovery-small.sh
index 605c092cf3..3007a0b0bb 100755
--- a/lustre/tests/recovery-small.sh
+++ b/lustre/tests/recovery-small.sh
@@ -7,7 +7,7 @@ ALWAYS_EXCEPT="20b"
 
 
 LUSTRE=${LUSTRE:-`dirname $0`/..}
-UPCALL=${UPCALL:-$PWD/recovery-small-upcall.sh}
+
 . $LUSTRE/tests/test-framework.sh
 
 init_test_env $@
@@ -27,12 +27,12 @@ gen_config() {
     rm -f $XMLCONFIG
 
     if [ "$MDSCOUNT" -gt 1 ]; then
-        add_lmv lmv1
+        add_lmv lmv1_svc
         for mds in `mds_list`; do
             MDSDEV=$TMP/${mds}-`hostname`
-            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1
+            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1_svc
         done
-        add_lov_to_lmv lov1 lmv1 --stripe_sz $STRIPE_BYTES \
+        add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
 	MDS=lmv1
     else
@@ -45,7 +45,7 @@ gen_config() {
 
     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
-    add_client client --mds ${MDS} --lov lov1 --path $MOUNT
+    add_client client ${MDS} --lov lov1 --path $MOUNT
 }
 
 setup() {
@@ -257,9 +257,10 @@ test_17() {
     # client will get evicted here
     sysctl -w lustre.fail_loc=0x80000503
     do_facet client cp /etc/termcap $DIR/$tfile
-    sysctl -w lustre.fail_loc=0
 
     sleep $TIMEOUT
+    sysctl -w lustre.fail_loc=0
+    do_facet client "df $DIR"
     # expect cmp to fail
     do_facet client "cmp /etc/termcap $DIR/$tfile"  && return 1
     do_facet client "rm $DIR/$tfile" || return 2
@@ -329,6 +330,8 @@ test_19a() {
     drop_ldlm_cancel "chmod 0777 $f"  || echo evicted
 
     do_facet client checkstat -v -p 0777 $f  || echo evicted
+    # let the client reconnect
+    sleep 5
     do_facet client "munlink $f"
 }
 run_test 19a "test expired_lock_main on mds (2867)"
@@ -351,7 +354,7 @@ test_20a() {	# bug 2983 - ldlm_handle_enqueue cleanup
 	mkdir -p $DIR/$tdir
 	multiop $DIR/$tdir/${tfile} O_wc &
 	MULTI_PID=$!
-	usleep 500
+	sleep 1
 	cancel_lru_locks OSC
 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308
 	do_facet ost sysctl -w lustre.fail_loc=0x80000308
diff --git a/lustre/tests/rename_many.c b/lustre/tests/rename_many.c
index faf5085741..3722cade7f 100644
--- a/lustre/tests/rename_many.c
+++ b/lustre/tests/rename_many.c
@@ -108,9 +108,8 @@ int main(int argc, char *argv[])
 			if (end && *end == '\0') {
 				seed = i;
 			} else {
-				fprintf(stderr, "bad seed '%s'\n", optarg);
-				usage(argv[0]);
-				return 1;
+                                seed = random();
+                                fprintf(stderr, "using random seed %u\n", seed);
 			}
 			break;
 		case 'v':
diff --git a/lustre/tests/replay-dual.sh b/lustre/tests/replay-dual.sh
index 73c922d48b..665dbbe885 100755
--- a/lustre/tests/replay-dual.sh
+++ b/lustre/tests/replay-dual.sh
@@ -9,15 +9,18 @@ init_test_env $@
 
 . ${CONFIG:=$LUSTRE/tests/cfg/lmv.sh}
 
+SETUP=${SETUP:-"setup"}
+CLEANUP=${CLEANUP:-"cleanup"}
+
 gen_config() {
     rm -f $XMLCONFIG
     if [ "$MDSCOUNT" -gt 1 ]; then
-        add_lmv lmv1
+        add_lmv lmv1_svc
         for mds in `mds_list`; do
             MDSDEV=$TMP/${mds}-`hostname`
-            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1
+            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1_svc
         done
-        add_lov_to_lmv lov1 lmv1 --stripe_sz $STRIPE_BYTES \
+        add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
 	MDS=lmv1
     else
@@ -28,9 +31,9 @@ gen_config() {
 
     fi
 
-    add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
-    add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
-    add_client client --mds ${MDS} --lov lov1 --path $MOUNT
+    add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE --failover
+    add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE  --failover
+    add_client client  ${MDS} --lov lov1 --path $MOUNT
 }
 
 
@@ -217,26 +220,6 @@ test_6b() {
 }
 run_test 6b "open1, open2, unlink |X| close2 [fail mds] close1"
 
-test_7() {
-    replay_barrier mds1
-    createmany -o $MOUNT1/$tfile- 25
-    createmany -o $MOUNT2/$tfile-2- 1
-    createmany -o $MOUNT1/$tfile-3- 25
-    umount $MOUNT2
-
-    facet_failover mds1
-    # expect failover to fail
-    df $MOUNT && return 1
-
-#   3313 - current fix for 3313 prevents any reply here
-#    unlinkmany $MOUNT1/$tfile- 25 || return 2
-
-    zconf_mount `hostname` $MOUNT2
-    return 0
-}
-run_test 7 "timeouts waiting for lost client during replay"
-
-
 test_8() {
     replay_barrier mds1
     drop_reint_reply "mcreate $MOUNT1/$tfile"    || return 1
@@ -348,7 +331,86 @@ test_13() {
 }
 run_test 13 "close resend timeout"
 
-test_20 () {
+
+test_14() {
+    replay_barrier mds1
+    createmany -o $MOUNT1/$tfile- 25
+    createmany -o $MOUNT2/$tfile-2- 1
+    createmany -o $MOUNT1/$tfile-3- 25
+    umount $MOUNT2
+
+    facet_failover mds1
+    # expect failover to fail
+    df $MOUNT && return 1
+
+    # first 25 files shouuld have been
+    # replayed
+    sleep 2 
+    unlinkmany $MOUNT1/$tfile- 25 || return 2
+
+    zconf_mount `hostname` $MOUNT2
+    return 0
+}
+run_test 14 "timeouts waiting for lost client during replay"
+
+test_15() {
+    replay_barrier mds1
+    createmany -o $MOUNT1/$tfile- 25
+    createmany -o $MOUNT2/$tfile-2- 1
+    umount $MOUNT2
+
+    facet_failover mds1
+    df $MOUNT || return 1
+
+    unlinkmany $MOUNT1/$tfile- 25 || return 2
+
+    zconf_mount `hostname` $MOUNT2
+    return 0
+}
+run_test 15 "timeout waiting for lost client during replay, 1 client completes"
+test_16() {
+    replay_barrier mds1
+    createmany -o $MOUNT1/$tfile- 25
+    createmany -o $MOUNT2/$tfile-2- 1
+    umount $MOUNT2
+
+    facet_failover mds1
+    sleep $TIMEOUT
+    facet_failover mds1
+    df $MOUNT || return 1
+
+    unlinkmany $MOUNT1/$tfile- 25 || return 2
+
+    zconf_mount `hostname` $MOUNT2
+    return 0
+
+}
+#run_test 16 "fail MDS during recovery (3571)"
+
+test_17() {
+    createmany -o $MOUNT1/$tfile- 25
+    createmany -o $MOUNT2/$tfile-2- 1
+
+    # Make sure the disconnect is lost
+    replay_barrier ost
+    umount $MOUNT2
+
+    echo -1 > /proc/sys/portals/debug
+    facet_failover ost
+    sleep $TIMEOUT
+    facet_failover ost
+    df $MOUNT || return 1
+
+    unlinkmany $MOUNT1/$tfile- 25 || return 2
+
+    zconf_mount `hostname` $MOUNT2
+    return 0
+
+}
+#Still not support ost fail over
+#run_test 17 "fail OST during recovery (3571)"
+
+test_18 () {
     replay_barrier mds1
     multiop $MOUNT2/$tfile O_c &
     pid2=$!
@@ -364,9 +426,37 @@ test_20 () {
     df || df ||  return 1
     zconf_mount `hostname` $MOUNT2
 }
-run_test 20 "replay open, Abort recovery, don't assert (3892)"
+run_test 18 "replay open, Abort recovery, don't assert (3892)"
+
+
+# cleanup with blocked enqueue fails until timer elapses (MDS busy), wait for
+# itexport NOW=0
+
+test_20() {     # bug 3822 - evicting client with enqueued lock
+       mkdir -p $MOUNT1/$tdir
+       touch $MOUNT1/$tdir/f0
+#define OBD_FAIL_LDLM_ENQUEUE_BLOCKED    0x30b
+       statmany -s $MOUNT1/$tdir/f 500 &
+       OPENPID=$!
+       NOW=`date +%s`
+       do_facet mds1 sysctl -w lustre.fail_loc=0x8000030b  # hold enqueue
+       sleep 1
+#define OBD_FAIL_LDLM_BL_CALLBACK        0x305
+       do_facet client sysctl -w lustre.fail_loc=0x80000305  # drop cb, evict
+       cancel_lru_locks MDC
+       usleep 500 # wait to ensure first client is one that will be evicted
+       openfile -f O_RDONLY $MOUNT2/$tdir/f0
+       wait $OPENPID
+       dmesg | grep "entering recovery in server" && \
+               error "client not evicted" || true
+}
+run_test 20 "ldlm_handle_enqueue succeeds on evicted export (3822)"
 
 if [ "$ONLY" != "setup" ]; then
 	equals_msg test complete, cleaning up
+	if [ $NOW ]; then
+            SLEEP=$((`date +%s` - $NOW))
+            [ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP
+	fi
 	$CLEANUP
 fi
diff --git a/lustre/tests/replay-ost-single.sh b/lustre/tests/replay-ost-single.sh
index c90891aec0..bda77dfff0 100755
--- a/lustre/tests/replay-ost-single.sh
+++ b/lustre/tests/replay-ost-single.sh
@@ -18,12 +18,12 @@ ALWAYS_EXCEPT="5"
 gen_config() {
     rm -f $XMLCONFIG
     if [ "$MDSCOUNT" -gt 1 ]; then
-        add_lmv lmv1
+        add_lmv lmv1_svc
         for mds in `mds_list`; do
             MDSDEV=$TMP/${mds}-`hostname`
-            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1
+            add_mds $mds --dev $MDSDEV --size $MDSSIZE  --lmv lmv1_svc
         done
-        add_lov_to_lmv lov1 lmv1 --stripe_sz $STRIPE_BYTES \
+        add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
 	MDS=lmv1
     else
@@ -38,7 +38,7 @@ gen_config() {
     if [ ! -z "$ostfailover_HOST" ]; then
 	 add_ostfailover ost --dev $OSTDEV --size $OSTSIZE
     fi
-    add_client client --mds $MDS --lov lov1 --path $MOUNT
+    add_client client $MDS --lov lov1 --path $MOUNT
 }
 
 cleanup() {
diff --git a/lustre/tests/replay-sanity.sh b/lustre/tests/replay-sanity.sh
new file mode 100755
index 0000000000..73d228fb65
--- /dev/null
+++ b/lustre/tests/replay-sanity.sh
@@ -0,0 +1,248 @@
+#!/bin/sh
+
+set -e
+
+#
+# This test needs to be run on the client
+#
+
+LUSTRE=${LUSTRE:-`dirname $0`/..}
+. $LUSTRE/tests/test-framework.sh
+
+init_test_env $@
+
+. ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
+
+# Skip these tests
+ALWAYS_EXCEPT="1 3"
+
+gen_config() {
+    rm -f $XMLCONFIG
+    add_mds mds --dev $MDSDEV --size $MDSSIZE
+    if [ ! -z "$mdsfailover_HOST" ]; then
+	 add_mdsfailover mds --dev $MDSDEV --size $MDSSIZE
+    fi
+    
+    add_lov lov1 mds --stripe_sz $STRIPE_BYTES \
+	--stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
+    add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
+    add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
+    add_client client mds --lov lov1 --path $MOUNT
+}
+
+build_test_filter
+
+cleanup() {
+    # make sure we are using the primary MDS, so the config log will
+    # be able to clean up properly.
+    activemds=`facet_active mds`
+    if [ $activemds != "mds" ]; then
+        fail mds
+    fi
+    zconf_umount `hostname` $MOUNT
+    stop mds ${FORCE} $MDSLCONFARGS
+    stop ost2 ${FORCE} --dump cleanup.log
+    stop ost ${FORCE} --dump cleanup.log
+}
+
+if [ "$ONLY" == "cleanup" ]; then
+    sysctl -w portals.debug=0 || true
+    cleanup
+    exit
+fi
+
+SETUP=${SETUP:-"setup"}
+CLEANUP=${CLEANUP:-"cleanup"}
+
+setup() {
+    gen_config
+
+    start ost --reformat $OSTLCONFARGS 
+    start ost2 --reformat $OSTLCONFARGS 
+    [ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE
+    start mds $MDSLCONFARGS --reformat
+    grep " $MOUNT " /proc/mounts || zconf_mount `hostname` $MOUNT
+}
+
+$SETUP
+
+if [ "$ONLY" == "setup" ]; then
+    exit 0
+fi
+
+mkdir -p $DIR
+ 
+# bug 3488 - test MDS replay more intensely
+test_1() {
+    sh rundbench 2 &
+    pid=$!
+    sleep 3
+    replay_barrier mds
+    sleep 2
+    fail mds
+    wait $PID || return 1
+}
+run_test 1 "fail MDS during dbench"
+
+test_2() {
+    mkdir $DIR/$tdir
+    bonnie++ -u root -d $DIR/$tdir -s 0 -n 1 &
+    pid=$!
+    sleep 3
+    replay_barrier mds
+    sleep 2
+    fail mds
+    wait $PID || return 1
+    rm -rf $DIR/root
+}
+run_test 2 "fail MDS during bonnie++"
+
+if [ $UID -ne 0 ]; then
+        RUNAS_ID="$UID"
+        RUNAS=""
+else
+        RUNAS_ID=${RUNAS_ID:-500}
+        RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
+fi
+
+OLDTMPDIR=$TMPDIR
+OLDTMP=$TMP
+TMPDIR=/tmp
+TMP=/tmp
+OLDHOME=$HOME
+[ $RUNAS_ID -ne $UID ] && HOME=/tmp
+                                                                                                                             
+test_3() {
+    cvsroot=$DIR/${tdir}-csvroot
+    repos=${tdir}-repos
+    mkdir -p $cvsroot
+    chown $RUNAS_ID $cvsroot
+    $RUNAS cvs -d $cvsroot init || error
+
+    cd /etc/init.d
+    # some versions of cvs import exit(1) when asked to import links or
+    # files they can't read.  ignore those files.
+    TOIGNORE=$(find . -type l -printf '-I %f\n' -o \
+                    ! -perm +4 -printf '-I %f\n')
+    $RUNAS cvs -d $cvsroot import -m "nomesg" $TOIGNORE \
+            $repos vtag rtag
+
+    cd $DIR
+	mkdir -p $DIR/$repos
+    chown $RUNAS_ID $DIR/$repos
+    $RUNAS cvs -d $cvsroot co $repos
+
+    cd $DIR/$repos
+
+    for i in `seq 1 20`; do
+        $RUNAS touch ${tfile}-$i
+        $RUNAS cvs add -m 'addmsg' ${tfile}-$i
+    done
+
+    replay_barrier mds
+    $RUNAS cvs update
+    $RUNAS cvs commit -m 'nomsg' ${tfile}-*
+    cd $LUSTRE
+    fail mds
+}
+run_test 3 "fail MDS during cvs commit"
+
+TMPDIR=$OLDTMPDIR
+TMP=$OLDTMP
+HOME=$OLDHOME
+
+test_4() {
+    touch $DIR/$tfile-1
+    ln $DIR/$tfile-1 $DIR/$tfile-2 || return 1
+
+    replay_barrier mds
+    multiop $DIR/$tfile-2 Ouc
+    fail mds
+
+    $CHECKSTAT -t file $DIR/$tfile-1 || return 2
+    rm -rf $DIR/$tfile-*
+}
+run_test 4 "|X| unlink file with multiple links while open"
+
+test_5() {
+    replay_barrier mds
+    touch $DIR/$tfile-1
+    ln $DIR/$tfile-1 $DIR/$tfile-2 || return 1
+    multiop $DIR/$tfile-2 Ouc
+
+    fail mds
+
+    $CHECKSTAT -t file $DIR/$tfile-1 || return 2
+    rm -rf $DIR/$tfile-*
+}
+run_test 5 "|X| unlink file with multiple links while open"
+
+test_6() {
+    touch $DIR/$tfile-1
+    ln $DIR/$tfile-1 $DIR/$tfile-2
+
+    replay_barrier mds
+    multiop $DIR/$tfile-1 O_uc &
+    MULTIPID=$!
+    multiop $DIR/$tfile-2 Ouc
+    usleep 500
+    fail mds
+
+    kill -USR1 $MULTIPID
+    wait $MUTLIPID || return 1
+
+    [ -e $DIR/$tfile-1 ] && return 2
+    [ -e $DIR/$tfile-2 ] && return 3
+    return 0
+}
+run_test 6 "|X| open-unlink file with multiple links"
+
+test_7() {
+    replay_barrier mds
+    touch $DIR/$tfile-1
+    ln $DIR/$tfile-1 $DIR/$tfile-2
+    multiop $DIR/$tfile-1 O_uc &
+    MULTIPID=$!
+
+    multiop $DIR/$tfile-2 Ouc
+    usleep 500
+
+    kill -USR1 $MULTIPID
+    wait $MUTLIPID || return 1
+    fail mds
+
+    [ -e $DIR/$tfile-1 ] && return 2
+    [ -e $DIR/$tfile-2 ] && return 3
+    return 0
+}
+run_test 7 "|X| open-unlink file with multiple links"
+
+test_8() {
+    replay_barrier mds
+    opendirunlink $DIR/$tdir $DIR/$tdir || return 1
+    fail mds
+    $CHECKSTAT -a $DIR/$tdir || return 2
+}
+run_test 8 "|X| remove of open directory"
+
+check_kernel_version() {
+    VERSION_FILE=/proc/fs/lustre/kernel_version
+    WANT_VER=$1
+    [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
+    GOT_VER=`cat $VERSION_FILE`
+    [ $GOT_VER -ge $WANT_VER ] && return 0
+    log "test needs at least kernel version $WANT_VER, running $GOT_VER"
+    return 1
+}
+
+test_9() {
+    check_kernel_version 34 || return 0
+    replay_barrier mds
+    openfilleddirunlink $DIR/$tdir || return 1
+    fail mds
+}
+run_test 9 "|X| remove of open non-empty directory"
+
+equals_msg test complete, cleaning up
+$CLEANUP
+ 
diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh
index 255ca403b1..3cc132a200 100755
--- a/lustre/tests/replay-single.sh
+++ b/lustre/tests/replay-single.sh
@@ -24,14 +24,14 @@ gen_config() {
     rm -f $XMLCONFIG
 
     if [ "$MDSCOUNT" -gt 1 ]; then
-        add_lmv lmv1
+        add_lmv lmv1_svc
         for mds in `mds_list`; do
             MDSDEV=$TMP/${mds}-`hostname`
-            add_mds $mds --dev $MDSDEV --size $MDSSIZE --lmv lmv1
+            add_mds $mds --dev $MDSDEV --size $MDSSIZE --lmv lmv1_svc
         done
-	MDS=lmv1
-        add_lov_to_lmv lov1 lmv1 --stripe_sz $STRIPE_BYTES \
+        add_lov_to_lmv lov1 lmv1_svc --stripe_sz $STRIPE_BYTES \
 	    --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
+	MDS=lmv1
     else
         add_mds mds1 --dev $MDSDEV --size $MDSSIZE
         if [ ! -z "$mds1failover_HOST" ]; then
@@ -44,7 +44,7 @@ gen_config() {
     
     add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
     add_ost ost2 --lov lov1 --dev ${OSTDEV}-2 --size $OSTSIZE
-    add_client client --mds $MDS --lov lov1 --path $MOUNT
+    add_client client $MDS --lov lov1 --path $MOUNT
 
 }
 
@@ -679,7 +679,7 @@ test_32() {
     # give multiop a chance to open
     sleep 1
     mds_evict_client
-    df $MOUNT || df $MOUNT || return 1
+    df $MOUNT || sleep 1 && df $MOUNT || return 1
     kill -USR1 $pid1
     kill -USR1 $pid2
     sleep 1
@@ -979,14 +979,38 @@ run_test 48 "Don't lose transno when client is evicted (2525)"
 
 # b=3550 - replay of unlink
 test_49() {
-    replay_barrier mds
+    replay_barrier mds1
     createmany -o $DIR/$tfile-%d 400 || return 1
     unlinkmany $DIR/$tfile-%d 0 400 || return 2
-    fail mds
+    fail mds1
     $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
 }
 run_test 49 "re-write records to llog as written during fail"
 
+test_50() {
+    local osc_dev=`$LCTL device_list | \
+               awk '(/ost_svc_mds1_svc/){print $4}' `
+    $LCTL --device %$osc_dev recover &&  $LCTL --device %$osc_dev recover
+    # give the mds_lov_sync threads a chance to run
+    sleep 5
+}
+run_test 50 "Double OSC recovery, don't LASSERT (3812)"
+
+# b3764 timed out lock replay
+test_52() {
+    touch $DIR/$tfile
+    cancel_lru_locks MDC
+
+    multiop $DIR/$tfile s
+    replay_barrier mds1
+    do_facet mds1 "sysctl -w lustre.fail_loc=0x8000030c"
+    fail mds1
+    do_facet mds1 "sysctl -w lustre.fail_loc=0x0"
+
+    $CHECKSTAT -t file $DIR/$tfile-* && return 3 || true
+}
+run_test 52 "time out lock replay (3764)"
+
 equals_msg test complete, cleaning up
 $CLEANUP
 
diff --git a/lustre/tests/rmdirmany.c b/lustre/tests/rmdirmany.c
new file mode 100755
index 0000000000..d0c663ac80
--- /dev/null
+++ b/lustre/tests/rmdirmany.c
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+int main(int argc, char ** argv)
+{
+        int i, rc = 0, count;
+        char dirname[4096];
+
+        if (argc < 3) {
+                printf("Usage %s dirnamebase count\n", argv[0]);
+                return 1;
+        }
+
+        if (strlen(argv[1]) > 4080) {
+                printf("name too long\n");
+                return 1;
+        }
+
+        count = strtoul(argv[2], NULL, 0);
+
+        for (i = 0; i < count; i++) {
+                sprintf(dirname, "%s-%d", argv[1], i);
+                rc = rmdir(dirname);
+                if (rc) {
+                        printf("rmdir(%s) error: %s\n",
+                               dirname, strerror(errno));
+                        break;
+                }
+		if ((i % 10000) == 0)
+		    printf(" - deleted %d (time %ld)\n", i, time(0));
+        }
+        return rc;
+}
diff --git a/lustre/tests/runas.c b/lustre/tests/runas.c
index 91c9c7fe87..aa0bedcc35 100644
--- a/lustre/tests/runas.c
+++ b/lustre/tests/runas.c
@@ -18,7 +18,7 @@
 #endif
 
 static const char usage[] =
-"Usage: %s -u user_id [-g grp_id ] [ -G ] command\n"
+"Usage: %s -u user_id [-g grp_id] [-G[gid0,gid1,...]] command\n"
 "  -u user_id           switch to UID user_id\n"
 "  -g grp_id            switch to GID grp_id\n"
 "  -G[gid0,gid1,...]    set supplementary groups\n";
diff --git a/lustre/tests/runtests b/lustre/tests/runtests
index d97bdeac33..aa30f9f1b8 100755
--- a/lustre/tests/runtests
+++ b/lustre/tests/runtests
@@ -31,13 +31,14 @@ SRC=/etc
 while [ "$1" ]; do
 	case $1 in
 	*.xml) export NAME=`echo $1 | sed "s/.xml//"` ;;
+	*) OPTS="$OPTS $1" ;;
 	esac
 	shift
 done
 
 MOUNT="`mount | awk '/ lustre_lite / { print $3 }' | tail -n 1`"
 if [ -z "$MOUNT" ]; then
-	sh llmount.sh
+	sh llmount.sh $OPTS
 	MOUNT="`mount | awk '/ lustre_lite / { print $3 }' | tail -n 1`"
 	[ -z "$MOUNT" ] && fail "no lustre filesystem mounted" 1
 	I_MOUNTED="yes"
@@ -90,7 +91,7 @@ done
 [ "$ERROR" ] && fail "old and new files are different" $ERROR
 
 sh llmountcleanup.sh || exit 19
-sh llrmount.sh || exit 20
+sh llrmount.sh $OPTS || exit 20
 
 log "comparing previously copied files"
 for f in $FILES; do
diff --git a/lustre/tests/sanity-buffalo.sh b/lustre/tests/sanity-buffalo.sh
index 70e4a392df..02c95d1ad1 100755
--- a/lustre/tests/sanity-buffalo.sh
+++ b/lustre/tests/sanity-buffalo.sh
@@ -31,7 +31,7 @@ export TESTDESC=${TESTDESC:-"Local test in $TARGET for correctness"}
 export TESTGROUP=${TESTGROUP:-"correctness"}
 export LUSTRE_TAG=${LUSTRE_TAG:-`cat $PWD/CVS/Tag | cut -c 2-`}
 export TESTARCH=${TESTARCH:-`uname -r`}
-export NETWORKTYPE=${NETWORKTYPE:-"tcp"}
+export NETTYPE=${NETTYPE:-"tcp"}
 export MACHINENAME=${MACHINENAME:-`hostname`}
 
 usage() {
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index ed4a78e7aa..b6d051cd10 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -7,13 +7,11 @@
 set -e
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 2108
-RENAME_TESTS="24a 24b 24c 24d 24e 24f 24g 24h 24i 24j 24k 24l 24m 24n 24o 48a 48d"
+# bug number for skipped test: 2108 3637 3561 
+RENAME_TESTS="24a 24b 24c 24d 24e 24f 24g 24h 24i 24j 24k 24l 24m 24n 24o 42a 42c 45 48a 48b  48c 48d 51b 51c 65a 65b 65c 65d 65e 65f"
 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"$RENAME_TESTS 58"}
+
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
-case `uname -r` in
-2.6.*) ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c 55" # bug 3117
-esac
 
 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
 
@@ -40,6 +38,7 @@ SOCKETSERVER=${SOCKETSERVER:-socketserver}
 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
 IOPENTEST1=${IOPENTEST1:-iopentest1}
 IOPENTEST2=${IOPENTEST2:-iopentest2}
+MEMHOG=${MEMHOG:-memhog}
 
 if [ $UID -ne 0 ]; then
 	RUNAS_ID="$UID"
@@ -58,7 +57,7 @@ clean() {
 	sh llmountcleanup.sh > /dev/null || exit 20
 	I_MOUNTED=no
 }
-CLEAN=${CLEAN:-clean}
+CLEAN=${CLEAN:-:}
 
 start() {
 	echo -n "mnt.."
@@ -66,7 +65,7 @@ start() {
 	I_MOUNTED=yes
 	echo "done"
 }
-START=${START:-start}
+START=${START:-}
 
 log() {
 	echo "$*"
@@ -97,7 +96,7 @@ run_one() {
 		$START
 	fi
 	echo -1 >/proc/sys/portals/debug	
-	log "== test $1: $2"
+	log "== test $1: $2= `date +%H:%M:%S`"
 	export TESTNAME=test_$1
 	test_$1 || error "test_$1: exit with rc=$?"
 	unset TESTNAME
@@ -196,6 +195,8 @@ EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
 touch $EXT2_DEV
 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
 
+umask 077
+
 test_0() {
 	touch $DIR/f
 	$CHECKSTAT -t file $DIR/f || error
@@ -204,6 +205,13 @@ test_0() {
 }
 run_test 0 "touch .../f ; rm .../f ============================="
 
+test_0b() {
+       chmod 0755 $DIR || error
+       $CHECKSTAT -p 0755 $DIR || error
+}
+run_test 0b "chmod 0755 $DIR ============================="
+
+
 test_1a() {
 	mkdir $DIR/d1
 	mkdir $DIR/d1/d2
@@ -566,7 +574,7 @@ run_test 24c "mkdir .../R3/f; rename .../R3/f .../R3/g ========="
 test_24d() {
 	mkdir $DIR/R4
 	mkdir $DIR/R4/{f,g}
-	perl -e "rename \"$DIR/R4/f\", \"$DIR/R4/g\";"
+	mrename $DIR/R4/f $DIR/R4/g
 	$CHECKSTAT -a $DIR/R4/f || error
 	$CHECKSTAT -t dir $DIR/R4/g || error
 }
@@ -598,23 +606,23 @@ test_24g() {
 	$CHECKSTAT -a $DIR/R7a/d || error
 	$CHECKSTAT -t dir $DIR/R7b/e || error
 }
-run_test 24g "mkdir .../R7a/d; rename .../R7a/d .../R5b/e ======"
+run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R5b/e ======"
 
 test_24h() {
 	mkdir $DIR/R8{a,b}
 	mkdir $DIR/R8a/d $DIR/R8b/e
-	perl -e "rename \"$DIR/R8a/d\", \"$DIR/R8b/e\";"
+	mrename $DIR/R8a/d $DIR/R8b/e
 	$CHECKSTAT -a $DIR/R8a/d || error
 	$CHECKSTAT -t dir $DIR/R8b/e || error
 }
-run_test 24h "mkdir .../R8{a,b} R8a/{d,e}; mv .../R8a/d .../R8b/e"
+run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
 
 test_24i() {
 	echo "-- rename error cases"
 	mkdir $DIR/R9
 	mkdir $DIR/R9/a
 	touch $DIR/R9/f
-	perl -e "rename \"$DIR/R9/f\", \"$DIR/R9/a\";"
+	mrename $DIR/R9/f $DIR/R9/a
 	$CHECKSTAT -t file $DIR/R9/f || error
 	$CHECKSTAT -t dir  $DIR/R9/a || error
 	$CHECKSTAT -a file $DIR/R9/a/f || error
@@ -623,7 +631,7 @@ run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
 
 test_24j() {
 	mkdir $DIR/R10
-	perl -e "rename \"$DIR/R10/f\", \"$DIR/R10/g\"" 
+	mrename $DIR/R10/f $DIR/R10/g
 	$CHECKSTAT -t dir $DIR/R10 || error
 	$CHECKSTAT -a $DIR/R10/f || error
 	$CHECKSTAT -a $DIR/R10/g || error
@@ -665,10 +673,60 @@ run_test 24n "Statting the old file after renameing (Posix rename 2)"
 
 test_24o() {
 	check_kernel_version 37 || return 0
-	rename_many -s 3287 -v -n 10 $DIR
+	rename_many -s random -v -n 10 $DIR
 }
 run_test 24o "rename of files during htree split ==============="
 
+test_24p() {
+       mkdir $DIR/R12{a,b}
+       DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
+       mrename $DIR/R12a $DIR/R12b
+       $CHECKSTAT -a $DIR/R12a || error
+       $CHECKSTAT -t dir $DIR/R12b || error
+       DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
+       [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
+}
+run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
+
+test_24q() {
+       mkdir $DIR/R13{a,b}
+       DIRINO=`ls -lid $DIR/R13a | awk '{ print $1 }'`
+       multiop $DIR/R13b D_c &
+       MULTIPID=$!
+
+       mrename $DIR/R13a $DIR/R13b
+       $CHECKSTAT -a $DIR/R13a || error
+       $CHECKSTAT -t dir $DIR/R13b || error
+       DIRINO2=`ls -lid $DIR/R13b | awk '{ print $1 }'`
+       [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
+       kill -USR1 $MULTIPID
+       wait $MULTIPID || error "multiop close failed"
+}
+run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
+
+test_24r() { #bug 3789
+       mkdir $DIR/R14a $DIR/R14a/b
+       mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
+       $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
+       $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
+}
+run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
+
+test_24s() {
+       mkdir $DIR/R15a $DIR/R15a/b $DIR/R15a/b/c
+       mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
+       $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
+       $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
+}
+run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
+test_24t() {
+       mkdir $DIR/R16a $DIR/R16a/b $DIR/R16a/b/c
+       mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
+       $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
+       $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
+}
+run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
+
 test_25a() {
 	echo '== symlink sanity ============================================='
 	mkdir $DIR/d25
@@ -723,8 +781,8 @@ run_test 26e "unlink multiple component recursive symlink ======"
 test_27a() {
 	echo '== stripe sanity =============================================='
 	mkdir $DIR/d27
-	$LSTRIPE $DIR/d27/f0 65536 0 1 || error
-	$CHECKSTAT -t file $DIR/d27/f0 || error
+        $LSTRIPE $DIR/d27/f0 65536 0 1 || error "lstripe failed"
+        $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed"
 	pass
 	log "== test_27b: write to one stripe file ========================="
 	cp /etc/hosts $DIR/d27/f0 || error
@@ -736,12 +794,12 @@ test_27c() {
 	if [ ! -d $DIR/d27 ]; then
 		mkdir $DIR/d27
 	fi
-	$LSTRIPE $DIR/d27/f01 65536 0 2 || error
+	$LSTRIPE $DIR/d27/f01 65536 0 2 || error "lstripe failed"
 	[ `$LFIND $DIR/d27/f01 | grep -A 10 obdidx | wc -l` -eq 4 ] ||
 		error "two-stripe file doesn't have two stripes"
 	pass
 	log "== test_27d: write to two stripe file file f01 ================"
-	dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error
+	dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
 }
 run_test 27c "create two stripe file f01 ======================="
 
@@ -749,8 +807,8 @@ test_27d() {
 	if [ ! -d $DIR/d27 ]; then
 		mkdir $DIR/d27
 	fi
-	$LSTRIPE $DIR/d27/fdef 0 -1 0 || error
-	$CHECKSTAT -t file $DIR/d27/fdef || error
+        $LSTRIPE $DIR/d27/fdef 0 -1 0 || error "lstripe failed"
+        $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed"
 	#dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error
 }
 run_test 27d "create file with default settings ================"
@@ -759,9 +817,9 @@ test_27e() {
 	if [ ! -d $DIR/d27 ]; then
 		mkdir $DIR/d27
 	fi
-	$LSTRIPE $DIR/d27/f12 65536 0 2 || error
-	$LSTRIPE $DIR/d27/f12 65536 0 2 && error
-	$CHECKSTAT -t file $DIR/d27/f12 || error
+        $LSTRIPE $DIR/d27/f12 65536 0 2 || error "lstripe failed"
+        $LSTRIPE $DIR/d27/f12 65536 0 2 && error "lstripe succeeded twice"
+        $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed"
 }
 run_test 27e "lstripe existing file (should return error) ======"
 
@@ -769,9 +827,10 @@ test_27f() {
 	if [ ! -d $DIR/d27 ]; then
 		mkdir $DIR/d27
 	fi
-	$LSTRIPE $DIR/d27/fbad 100 0 1 && error
-	dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4 || error
-	$LFIND $DIR/d27/fbad || error
+        $LSTRIPE $DIR/d27/fbad 100 0 1 && error "lstripe failed"
+        dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4 || error "dd failed"
+        $LFIND $DIR/d27/fbad || error "lfind failed"
+
 }
 run_test 27f "lstripe with bad stripe size (should return error)"
 
@@ -779,14 +838,15 @@ test_27g() {
 	if [ ! -d $DIR/d27 ]; then
 		mkdir $DIR/d27
 	fi
-	$MCREATE $DIR/d27/fnone || error
+	$MCREATE $DIR/d27/fnone || error "mcreate failed"
 	pass
 	log "== test 27h: lfind with no objects ============================"
-	$LFIND $DIR/d27/fnone 2>&1 | grep "no stripe info" || error
+	$LFIND $DIR/d27/fnone 2>&1 | grep "no stripe info" || error "has object"
 	pass
 	log "== test 27i: lfind with some objects =========================="
-	touch $DIR/d27/fsome || error
-	$LFIND $DIR/d27/fsome | grep obdidx || error
+	touch $DIR/d27/fsome || error "touch failed"
+        $LFIND $DIR/d27/fsome | grep obdidx || error "missing objects"
+
 }
 run_test 27g "test lfind ======================================="
 
@@ -794,7 +854,7 @@ test_27j() {
         if [ ! -d $DIR/d27 ]; then
                 mkdir $DIR/d27
         fi
-        $LSTRIPE $DIR/d27/f27j 65536 $OSTCOUNT 1 && error || true
+	$LSTRIPE $DIR/d27/f27j 65536 $OSTCOUNT 1 && error "lstripe failed"||true
 }
 run_test 27j "lstripe with bad stripe offset (should return error)"
 
@@ -885,7 +945,7 @@ test_31c() {
 	multiop $DIR/f31c Ouc
 	usleep 500
 	kill -USR1 $MULTIPID
-	wait $MUTLIPID
+	wait $MULTIPID
 }
 run_test 31c "open-unlink file with multiple links ============="
 
@@ -895,7 +955,7 @@ test_31d() {
 }
 run_test 31d "remove of open directory ========================="
 
-test_31e() {
+test_31e() { # bug 2904
 	check_kernel_version 34 || return 0
 	openfilleddirunlink $DIR/d31e || error
 }
@@ -1384,7 +1444,7 @@ trunc_test() {
 test_42c() {
         trunc_test 42c 1024
         [ $BEFOREWRITES -eq $AFTERWRITES ] && \
-            error "$BEFOREWRITES < $AFTERWRITES on truncate"
+		error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
         rm $file
 }
 run_test 42c "test partial truncate of file with cached dirty data"
@@ -1571,8 +1631,9 @@ test_48b() { # bug 2399
 	cd . && error "'cd .' worked after removing cwd"
 	mkdir . && error "'mkdir .' worked after removing cwd"
 	rmdir . && error "'rmdir .' worked after removing cwd"
-	ln -s . foo && error "'ln -s .' worked after removing cwd" || true
-	#cd .. || error "'cd ..' failed after removing cwd"
+        ln -s . foo && error "'ln -s .' worked after removing cwd"
+        cd .. || echo "'cd ..' failed after removing cwd `pwd`"  #bug 3517
+
 }
 run_test 48b "Access removed working dir (should return errors)="
 
@@ -1587,11 +1648,11 @@ test_48c() { # bug 2350
 	$TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
 	$TRACE ls . && error "'ls .' worked after removing cwd"
 	$TRACE ls .. || error "'ls ..' failed after removing cwd"
-	$TRACE cd . && error "'cd .' worked after recreate cwd"
+	$TRACE cd . && error "'cd .' worked after removing cwd"
 	$TRACE mkdir . && error "'mkdir .' worked after removing cwd"
 	$TRACE rmdir . && error "'rmdir .' worked after removing cwd"
-	$TRACE ln -s . foo && error "'ln -s .' worked after removing cwd" ||true
-	$TRACE cd .. || echo "'cd ..' failed after removing cwd (`pwd)`"
+        $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
+        $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
 }
 run_test 48c "Access removed working subdir (should return errors)"
 
@@ -1601,18 +1662,18 @@ test_48d() { # bug 2350
 	#set -vx
 	mkdir -p $DIR/d48d/dir
 	cd $DIR/d48d/dir
-	pwd
-	ls .
-	$TRACE rm -vr $DIR/d48d || error "remove cwd+parent $DIR/d48d failed"
-	$TRACE touch foo && error "'touch foo' worked after removing cwd"
-	$TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
-	$TRACE ls . && error "'ls .' worked after removing cwd"
-	$TRACE ls .. && echo "'ls ..' worked after removing cwd" # bug 3415
-	$TRACE cd . && error "'cd .' worked after recreate cwd"
-	$TRACE mkdir . && error "'mkdir .' worked after removing cwd"
-	$TRACE rmdir . && error "'rmdir .' worked after removing cwd"
-	$TRACE ln -s . foo && error "'ln -s .' worked after removing cwd" ||true
-	$TRACE cd .. && error "'cd ..' worked after removing cwd" || true
+        $TRACE rmdir $DIR/d48d/dir || error "remove cwd $DIR/d48d/dir failed"
+        $TRACE rmdir $DIR/d48d || error "remove parent $DIR/d48d failed"
+        $TRACE touch foo && error "'touch foo' worked after removing parent"
+        $TRACE mkdir foo && error "'mkdir foo' worked after removing parent"
+        $TRACE ls . && error "'ls .' worked after removing parent"
+        $TRACE ls .. && error "'ls ..' worked after removing parent"
+        $TRACE cd . && error "'cd .' worked after recreate parent"
+        $TRACE mkdir . && error "'mkdir .' worked after removing parent"
+        $TRACE rmdir . && error "'rmdir .' worked after removing parent"
+        $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
+        $TRACE cd .. && error "'cd ..' worked after removing parent" || true
+
 }
 run_test 48d "Access removed parent subdir (should return errors)"
 
@@ -1641,6 +1702,28 @@ test_51() {
 }
 run_test 51 "special situations: split htree with empty entry =="
 
+test_51b() {
+       NUMTEST=70000
+       check_kernel_version 40 || NUMTEST=31000
+       NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
+       [ $NUMFREE -lt $NUMTEST ] && \
+               echo "skipping test 51b, not enough free inodes($NUMFREE)" && \
+               return
+       mkdir -p $DIR/d51b
+       (cd $DIR/d51b; mkdirmany t $NUMTEST)
+}
+run_test 51b "mkdir .../t-0 --- .../t-$NUMTEST ===================="
+
+test_51c() {
+       NUMTEST=70000
+       check_kernel_version 40 || NUMTEST=31000
+       NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
+       [ $NUMFREE -lt $NUMTEST ] && echo "skipping test 51c" && return
+       mkdir -p $DIR/d51b
+       (cd $DIR/d51b; rmdirmany t $NUMTEST)
+}
+run_test 51c "rmdir .../t-0 --- .../t-$NUMTEST ===================="
+
 test_52a() {
 	[ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
 	mkdir -p $DIR/d52a
@@ -1707,17 +1790,30 @@ test_54b() {
 }
 run_test 54b "char device works in lustre ======================"
 
+find_loop_dev() {
+       [ "$LOOPNUM" ] && return
+       [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
+       [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
+       [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
+
+       for i in `seq 3 7`; do
+               losetup $LOOPBASE$i > /dev/null 2>&1 && continue
+               LOOPDEV=$LOOPBASE$i
+               LOOPNUM=$i
+               break
+       done
+}
+
 test_54c() {
 	tfile="$DIR/f54c"
 	tdir="$DIR/d54c"
 	loopdev="$DIR/loop54c"
 	
-	for i in `seq 3 7`; do
-		rm -f $loopdev
-		mknod $loopdev b 7 $i
-		losetup $loopdev > /dev/null 2>&1 || break
-	done
-	echo "make a loop file system with $tfile on $loopdev ($i)..."	
+        find_loop_dev
+        [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
+        mknod $loopdev b 7 $LOOPNUM
+        echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
+	
 	dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null
 	losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
 	mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
@@ -1740,16 +1836,26 @@ test_54d() {
 }
 run_test 54d "fifo device works in lustre ======================"
 
+check_fstype() {
+       grep -q $FSTYPE /proc/filesystems && return 0
+       modprobe $FSTYPE
+       grep -q $FSTYPE /proc/filesystems && return 0
+       insmod ../$FSTYPE/$FSTYPE.o
+       grep -q $FSTYPE /proc/filesystems && return 0
+       return 1
+}
+
 test_55() {
         rm -rf $DIR/d55
         mkdir $DIR/d55
-        mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error
-        touch $DIR/d55/foo
-        $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error
-        $IOPENTEST2 $DIR/d55 || error
-        echo "check for $EXT2_DEV. Please wait..."
+        check_fstype && echo "can't find fs $FSTYPE, skipping test 55" && return
+        mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting"
+	touch $DIR/d55/foo
+        $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1"
+        $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2"
+	echo "check for $EXT2_DEV. Please wait..."
         rm -rf $DIR/d55/*
-        umount $DIR/d55 || error
+        umount $DIR/d55 || error "unmounting"
 }
 run_test 55 "check iopen_connect_dentry() ======================"
 
@@ -2000,10 +2106,55 @@ test_67() { # bug 3285 - supplementary group fails on MDS, passes on client
 	mkdir $DIR/d67
 	chmod 771 $DIR/d67
 	chgrp $RUNAS_ID $DIR/d67
-	$RUNAS -g $((RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67 && error || true
+	$RUNAS -g $(($RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67 && error ||true
 }
 run_test 67 "supplementary group failure (should return error) ="
 
+cleanup_68() {
+       if [ "$LOOPDEV" ]; then
+               swapoff $LOOPDEV || error "swapoff failed"
+               losetup -d $LOOPDEV || error "losetup -d failed"
+               unset LOOPDEV LOOPNUM
+       fi
+       rm -f $DIR/f68
+}
+
+meminfo() {
+       awk '($1 == "'$1':") { print $2 }' /proc/meminfo
+}
+
+swap_used() {
+       swapon -s | awk '($1 == "'$1'") { print $4 }'
+}
+
+# excercise swapping to lustre by adding a high priority swapfile entry
+# and then consuming memory until it is used.
+test_68() {
+       [ "$UID" != 0 ] && echo "skipping test 68 (must run as root)" && return
+       [ "`lsmod|grep obdfilter`" ] && echo "skipping test 68 (local OST)" && \
+               return
+
+       find_loop_dev
+       dd if=/dev/zero of=$DIR/f68 bs=64k count=1024
+
+       trap cleanup_68 EXIT
+
+       losetup $LOOPDEV $DIR/f68 || error "losetup $LOOPDEV failed"
+       mkswap $LOOPDEV
+       swapon -p 32767 $LOOPDEV || error "swapon $LOOPDEV failed"
+
+       echo "before: `swapon -s | grep $LOOPDEV`"
+       KBFREE=`meminfo MemTotal`
+       $MEMHOG $KBFREE || error "error allocating $KBFREE kB"
+       echo "after: `swapon -s | grep $LOOPDEV`"
+       SWAPUSED=`swap_used $LOOPDEV`
+
+       cleanup_68
+
+       [ $SWAPUSED -eq 0 ] && echo "no swap used???" || true
+}
+run_test 68 "support swapping to Lustre ========================"
+
 # on the LLNL clusters, runas will still pick up root's $TMP settings,
 # which will not be writable for the runas user, and then you get a CVS
 # error message with a corrupt path string (CVS bug) and panic.
diff --git a/lustre/tests/sanityN.sh b/lustre/tests/sanityN.sh
index 974fdbb155..8ef42071fd 100644
--- a/lustre/tests/sanityN.sh
+++ b/lustre/tests/sanityN.sh
@@ -3,8 +3,8 @@
 set -e
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 1768
-ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"4   14b"}
+# bug number for skipped test: 1768 3192
+ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"4   14b 14c"}
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
@@ -31,22 +31,22 @@ else
 	RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
 fi
 
-export NAME=${NAME:-mount2}
-
 SAVE_PWD=$PWD
 
 clean() {
 	echo -n "cln.."
 	sh llmountcleanup.sh > /dev/null || exit 20
 }
-CLEAN=${CLEAN:-clean}
+
+CLEAN=${CLEAN:-}
 
 start() {
 	echo -n "mnt.."
 	sh llrmount.sh > /dev/null || exit 10
 	echo "done"
 }
-START=${START:-start}
+
+START=${START:-}
 
 log() {
 	echo "$*"
@@ -178,7 +178,7 @@ test_3() {
 run_test 3 "symlink on one mtpt, readlink on another ==========="
 
 test_4() {
-	./multifstat $DIR1/f4 $DIR2/f4
+	multifstat $DIR1/f4 $DIR2/f4
 }
 run_test 4 "fstat validation on multiple mount points =========="
 
@@ -191,17 +191,17 @@ test_5() {
 run_test 5 "create a file on one mount, truncate it on the other"
 
 test_6() {
-	./openunlink $DIR1/f6 $DIR2/f6 || error
+	openunlink $DIR1/f6 $DIR2/f6 || error
 }
 run_test 6 "remove of open file on other node =================="
 
 test_7() {
-	./opendirunlink $DIR1/d7 $DIR2/d7 || error
+	opendirunlink $DIR1/d7 $DIR2/d7 || error
 }
 run_test 7 "remove of open directory on other node ============="
 
 test_8() {
-	./opendevunlink $DIR1/dev8 $DIR2/dev8 || error
+	opendevunlink $DIR1/dev8 $DIR2/dev8 || error
 }
 run_test 8 "remove of open special file on other node =========="
 
@@ -290,11 +290,11 @@ test_14() {
 	$DIR2/d14/ls && error || true
 	exec 100<&-
 }
-run_test 14 "execution of file opened for write should return -ETXTBSY=="
+run_test 14 "execution of file open for write returns -ETXTBSY ="
 
 test_14a() {
         mkdir -p $DIR1/d14
-	cp -p `which multiop` $DIR1/d14/multiop
+	cp -p `which multiop` $DIR1/d14/multiop || error "cp failed"
         $DIR1/d14/multiop $TMP/test14.junk O_c &
         MULTIPID=$!
         sleep 1
@@ -302,11 +302,11 @@ test_14a() {
         kill -USR1 $MULTIPID || return 2
         wait $MULTIPID || return 3
 }
-run_test 14a "open(RDWR) of file being executed should return -ETXTBSY"
+run_test 14a "open(RDWR) of executing file returns -ETXTBSY ===="
 
-test_14b() {
+test_14b() { # bug 3192
         mkdir -p $DIR1/d14
-	cp -p `which multiop` $DIR1/d14/multiop
+	cp -p `which multiop` $DIR1/d14/multiop || error "cp failed"
         $DIR1/d14/multiop $TMP/test14.junk O_c &
         MULTIPID=$!
         sleep 1
@@ -314,7 +314,20 @@ test_14b() {
         kill -USR1 $MULTIPID || return 2
         wait $MULTIPID || return 3
 }
-run_test 14b "truncate of file being executed should return -ETXTBSY"
+run_test 14b "truncate of executing file returns -ETXTBSY ======"
+
+test_14c() { # bug 3430
+       mkdir -p $DIR1/d14
+       cp -p `which multiop` $DIR1/d14/multiop || error "cp failed"
+       $DIR1/d14/multiop $TMP/test14.junk O_c &
+       MULTIPID=$!
+       sleep 1
+       cp /etc/hosts $DIR2/d14/multiop && error "expected error, got success"
+       kill -USR1 $MULTIPID || return 2
+       wait $MULTIPID || return 3
+       #cmp `which multiop` $DIR1/d14/multiop || error "binary changed"
+}
+run_test 14c "open(O_TRUNC) of executing file return -ETXTBSY =="
 
 test_15() {	# bug 974 - ENOSPC
 	echo $PATH
@@ -323,11 +336,37 @@ test_15() {	# bug 974 - ENOSPC
 run_test 15 "test out-of-space with multiple writers ==========="
 
 test_16() {
-	./fsx -R -W -c 50 -p 100 -N 2500 \
-		$MOUNT1/fsxfile $MOUNT2/fsxfile
+	fsx -c 50 -p 100 -N 2500 $MOUNT1/fsxfile $MOUNT2/fsxfile
 }
 run_test 16 "2500 iterations of dual-mount fsx ================="
 
+cancel_lru_locks() {
+       for d in /proc/fs/lustre/ldlm/namespaces/$1*; do
+               echo clear > $d/lru_size
+       done
+       grep [0-9] /proc/fs/lustre/ldlm/namespaces/$1*/lock_unused_count /dev/null
+}
+
+test_17() { # bug 3513, 3667
+       [ ! -d /proc/fs/lustre/ost ] && echo "skipping OST-only test" && return
+
+       cp /etc/termcap $DIR1/f17
+       cancel_lru_locks OSC > /dev/null
+       #define OBD_FAIL_ONCE|OBD_FAIL_LDLM_CREATE_RESOURCE    0x30a
+       echo 0x8000030a > /proc/sys/lustre/fail_loc
+       ls -ls $DIR1/f17 | awk '{ print $1,$6 }' > $DIR1/f17-1 & \
+       ls -ls $DIR2/f17 | awk '{ print $1,$6 }' > $DIR2/f17-2
+       wait
+       diff -u $DIR1/f17-1 $DIR2/f17-2 || error "files are different"
+}
+run_test 17 "resource creation/LVB creation race ==============="
+
+test_18() {
+       ./mmap_sanity -d $MOUNT1 -m $MOUNT2
+}
+run_test 18 "mmap sanity check ================================="
+
+
 log "cleanup: ======================================================"
 rm -rf $DIR1/[df][0-9]* $DIR1/lnk || true
 
diff --git a/lustre/tests/test-framework.sh b/lustre/tests/test-framework.sh
index 3686c8f44b..c0f9c0f911 100644
--- a/lustre/tests/test-framework.sh
+++ b/lustre/tests/test-framework.sh
@@ -1,7 +1,6 @@
 #!/bin/sh
 
 set -e
-
 export REFORMAT=""
 export VERBOSE=false
 
@@ -94,7 +93,6 @@ zconf_mount() {
     else
        # this is so cheating
        do_node $client $LCONF --nosetup --node client_facet $XMLCONFIG  > /dev/null || return 2
-       $LCONF --nosetup --node client_facet $XMLCONFIG
        do_node $client $LLMOUNT `facet_active_host mds1`:/mds1_svc/client_facet $mnt -o nettype=$NETTYPE|| return 4
     fi
 
@@ -189,6 +187,7 @@ fail_abort() {
     start $facet
     do_facet $facet lctl --device %${facet}_svc abort_recovery
     df $MOUNT || echo "first df failed: $?"
+    sleep 1
     df $MOUNT || error "post-failover df: $?"
 }
 
@@ -197,25 +196,33 @@ do_lmc() {
 }
 
 h2gm () {
-   if [ "$1" = "client" ]; then echo \'*\'; else
+   if [ "$1" = "client" -o "$1" = "'*'" ]; then echo \'*\'; else
        $PDSH $1 $GMNALNID -l | cut -d\  -f2
    fi
 }
 
 h2tcp() {
-   if [ "$1" = "client" ]; then echo \'*\'; else
+   if [ "$1" = "client" -o "$1" = "'*'" ]; then echo \'*\'; else
    echo $1 
    fi
 }
 declare -fx h2tcp
 
 h2elan() {
-   if [ "$1" = "client" ]; then echo \'*\'; else
+   if [ "$1" = "client" -o "$1" = "'*'" ]; then echo \'*\'; else
    echo $1 | sed 's/[^0-9]*//g'
    fi
 }
 declare -fx h2elan
 
+h2openib() {
+   if [ "$1" = "client" -o "$1" = "'*'" ]; then echo \'*\'; else
+   echo $1 | sed 's/[^0-9]*//g'
+   fi
+}
+declare -fx h2openib
+
+
 facet_host() {
    local facet=$1
    varname=${facet}_HOST
@@ -235,6 +242,11 @@ facet_nid() {
 facet_active() {
     local facet=$1
     local activevar=${facet}active
+
+    if [ -f ./${facet}active ] ; then
+        source ./${facet}active
+    fi
+
     active=${!activevar}
     if [ -z "$active" ] ; then 
 	echo -n ${facet}
@@ -373,9 +385,10 @@ add_lmv() {
 
 add_client() {
     facet=$1
-    shift;
+    mds=$2
+    shift; shift
     add_facet $facet --lustre_upcall $UPCALL
-    do_lmc --add mtpt --node ${facet}_facet $*
+    do_lmc --add mtpt --node ${facet}_facet --mds ${mds}_svc $*
 }
 
 config_commit() {
diff --git a/lustre/tests/uml.sh b/lustre/tests/uml.sh
index acc38b9220..f9942a9812 100644
--- a/lustre/tests/uml.sh
+++ b/lustre/tests/uml.sh
@@ -19,6 +19,7 @@ STRIPE_BYTES=${STRIPE_BYTES:-1048576}
 OSDTYPE=${OSDTYPE:-obdfilter}
 OSTFAILOVER=${OSTFAILOVER:-}
 
+MOUNT=${MOUNT:-/mnt/lustre}
 FSTYPE=${FSTYPE:-ext3}
 
 NETTYPE=${NETTYPE:-tcp}
@@ -111,6 +112,6 @@ done
 echo; echo -n "adding CLIENT on:"
 for NODE in $CLIENTS; do
 	echo -n " $NODE"
-	${LMC} -m $config --add mtpt --node $NODE --path /mnt/lustre --mds mds1 --lov lov1 || exit 30
+	${LMC} -m $config --add mtpt --node $NODE --path $MOUNT --mds mds1 --lov lov1 || exit 30
 done
 echo
diff --git a/lustre/utils/Lustre/Makefile.am b/lustre/utils/Lustre/Makefile.am
index e8e522fc75..47dcf5dcf8 100644
--- a/lustre/utils/Lustre/Makefile.am
+++ b/lustre/utils/Lustre/Makefile.am
@@ -1,2 +1,5 @@
+if UTILS
 pymod_SCRIPTS = __init__.py lustredb.py error.py cmdline.py
-EXTRA_DIST = $(pymod_SCRIPTS)
+endif
+EXTRA_DIST = __init__.py lustredb.py error.py cmdline.py
+
diff --git a/lustre/utils/Makefile.am b/lustre/utils/Makefile.am
index 56c6d6f9cc..23eb8761e4 100644
--- a/lustre/utils/Makefile.am
+++ b/lustre/utils/Makefile.am
@@ -6,20 +6,21 @@ AM_CFLAGS=$(LLCFLAGS)
 AM_CPPFLAGS=$(LLCPPFLAGS)
 AM_LDFLAGS := -L$(top_builddir)/portals/utils
 
+sbin_scripts = lconf lmc llanalyze llstat.pl llobdstat.pl lactive      \
+       load_ldap.sh lrun lwizard
+bin_scripts = lfind lstripe
+
+
 if UTILS
 rootsbin_SCRIPTS = mount.lustre
 sbin_PROGRAMS = lctl obdio obdbarrier lload wirecheck wiretest llmount l_getgroups
-sbin_SCRIPTS = lconf lmc llanalyze llstat.pl llobdstat.pl lactive load_ldap.sh lrun
-sbin_SCRIPTS += lwizard
-bin_SCRIPTS = lfind lstripe
 bin_PROGRAMS = lfs
 lib_LIBRARIES = liblustreapi.a
-if LIBLUSTRE
-sbin_SCRIPTS += lrun
-endif # LIBLUSTRE
+sbin_SCRIPTS = $(sbin_scripts)
+bin_SCRIPTS = $(bin_scripts)
 endif # UTILS
 
-lctl_LDADD := $(LIBREADLINE) -lptlctl
+lctl_LDADD := $(LIBREADLINE) -lptlctl -lpthread
 lfs_LDADD := $(LIBREADLINE) parser.o liblustreapi.a -lptlctl obd.o
 lload_LDADD := $(LIBREADLINE) -lptlctl
 liblustreapi_a_SOURCES = liblustreapi.c
@@ -34,7 +35,7 @@ llmount_SOURCES = llmount.c
 llmount_LDADD = $(LIBREADLINE) -lptlctl
 l_getgroups_SOURCES = l_getgroups.c
 
-EXTRA_DIST = $(bin_SCRIPTS) $(sbin_SCRIPTS)
+EXTRA_DIST = $(bin_scripts) $(sbin_scripts)
 
 # NOTE: this should only be run on i386.
 newwiretest: wirehdr.c wirecheck
diff --git a/lustre/utils/lconf b/lustre/utils/lconf
index 13ed74116f..828db61c69 100755
--- a/lustre/utils/lconf
+++ b/lustre/utils/lconf
@@ -89,7 +89,8 @@ ptldebug_names = {
     "vfstrace" :  (1 << 21),
     "reada" :     (1 << 22),
     "config" :    (1 << 23),
-    }
+    "mmap" :      (1 << 24),    
+}
 
 subsystem_names = {
     "undefined" :    (1 << 0),
@@ -114,7 +115,7 @@ subsystem_names = {
     "gmnal" :        (1 << 19),
     "ptlrouter" :    (1 << 20),
     "cobd" :         (1 << 21),
-    "ibnal" :        (1 << 22),
+    "openibnal" :    (1 << 22),
     "cmobd" :        (1 << 23),
     }
 
@@ -252,21 +253,16 @@ class DaemonHandler:
             log(self.pidfile(), e)
 
 class AcceptorHandler(DaemonHandler):
-    def __init__(self, port, net_type, send_mem, recv_mem, irq_aff):
+    def __init__(self, port, net_type):
         DaemonHandler.__init__(self, "acceptor")
         self.port = port
         self.flags = ''
-        self.send_mem = send_mem
-        self.recv_mem = recv_mem
-
-        if irq_aff:
-            self.flags = self.flags + ' -i'
 
     def pidfile(self):
         return "/var/run/%s-%d.pid" % (self.command, self.port)
 
     def command_line(self):
-        return string.join(map(str,('-s', self.send_mem, '-r', self.recv_mem, self.flags, self.port)))
+	return string.join(map(str,(self.flags, self.port)))
 
 acceptors = {}
 
@@ -433,28 +429,26 @@ class LCTLInterface:
         cmds = "\n  add_uuid %s %s %s" %(uuid, nid, net_type)
         self.run(cmds)
 
-    def add_autoconn(self, net_type, send_mem, recv_mem, nid, hostaddr,
-                     port, flags):
-        if net_type  in ('tcp',) and not config.lctl_dump:
+    def add_peer(self, net_type, nid, hostaddr, port):     
+	if net_type  in ('tcp',) and not config.lctl_dump:
             cmds =  """
   network %s
-  send_mem %d
-  recv_mem %d
-  add_autoconn %s %s %d %s
+  add_peer %s %s %d
   quit""" % (net_type,
-             send_mem,
-             recv_mem,
-             nid, hostaddr, port, flags )
+             nid, hostaddr, port )
             self.run(cmds)
+        elif net_type in ('openib',) and not config.lctl_dump:
+            cmds =  """
+  network %s
+  add_peer %s
+  quit""" % (net_type,
+             nid)
+	    self.run(cmds)
 
     def connect(self, srv):
         self.add_uuid(srv.net_type, srv.nid_uuid, srv.nid)
-        if srv.net_type  in ('tcp',) and not config.lctl_dump:
-            flags = 's'
-            if srv.irq_affinity:
-                flags = flags + 'i'
-            self.add_autoconn(srv.net_type, srv.send_mem, srv.recv_mem,
-                 srv.nid, srv.hostaddr, srv.port, flags)
+        if srv.net_type  in ('tcp','openib',) and not config.lctl_dump:
+            self.add_peer(srv.net_type, srv.nid, srv.hostaddr, srv.port)
 
     # Recover a device
     def recover(self, dev_name, new_conn):
@@ -508,22 +502,29 @@ class LCTLInterface:
   quit  """ % (net, gw, tgt)
         self.run(cmds)
 
-
-    def del_autoconn(self, net_type, nid, hostaddr):
+    def del_peer(self, net_type, nid, hostaddr):
         if net_type  in ('tcp',) and not config.lctl_dump:
                 cmds =  """
   ignore_errors
   network %s
-  del_autoconn %s %s s
+  del_peer %s %s single_share
   quit""" % (net_type,
              nid, hostaddr)
                 self.run(cmds)
+        elif net_type  in ('openib',) and not config.lctl_dump:
+                cmds =  """
+  ignore_errors
+  network %s
+  del_peer %s single_share
+  quit""" % (net_type,
+             nid)
+                self.run(cmds)
 
     # disconnect one connection
     def disconnect(self, srv):
         self.del_uuid(srv.nid_uuid)
-        if srv.net_type  in ('tcp',) and not config.lctl_dump:
-            self.del_autoconn(srv.net_type, srv.nid, srv.hostaddr)
+        if srv.net_type  in ('tcp','openib',) and not config.lctl_dump:
+            self.del_peer(srv.net_type, srv.nid, srv.hostaddr)
 
     def del_uuid(self, uuid):
         cmds =  """
@@ -554,6 +555,13 @@ class LCTLInterface:
   quit""" % (name, setup)
         self.run(cmds)
 
+    def add_conn(self, name, conn_uuid):
+        cmds = """
+  cfg_device %s
+  add_conn %s
+  quit""" % (name, conn_uuid)
+        self.run(cmds)
+
 
     # create a new device with lctl
     def newdev(self, type, name, uuid, setup = ""):
@@ -579,11 +587,12 @@ class LCTLInterface:
 
     # create an lov
     def lov_setup(self, name, uuid, desc_uuid, stripe_cnt,
-                  stripe_sz, stripe_off, pattern):
+                  stripe_sz, stripe_off, pattern, devlist = None):
         cmds = """
   attach lov %s %s
-  lov_setup %s %d %d %d %s
-  quit""" % (name, uuid, desc_uuid, stripe_cnt, stripe_sz, stripe_off, pattern)
+  lov_setup %s %d %d %d %s %s
+  quit""" % (name, uuid, desc_uuid, stripe_cnt, stripe_sz, stripe_off, 
+	     pattern, devlist)
         self.run(cmds)
 
     # add an OBD to a LOV
@@ -747,6 +756,21 @@ def is_block(path):
     except OSError:
         return 0
     return stat.S_ISBLK(s[stat.ST_MODE])
+
+# find the journal device from mkfs options
+def jdev(opts):
+    if opts == None:
+        return ''
+    x=string.split(opts)
+    i=0
+    while i < len(x) - 1:
+        if x[i] == '-J' and x[i+1].startswith('device='):
+            str=x[i+1]
+            return str[7:]
+        i=i+1
+    return ''
+
+
     
 # build fs according to type
 # fixme: dangerous
@@ -763,14 +787,54 @@ def mkfs(dev, devsize, fstype, jsize, isize, mkfsoptions, isblock=1):
 
     if fstype in ('ext3', 'extN', 'ldiskfs'):
         # ext3 journal size is in megabytes
-        if jsize == 0:
-            if devsize == 0:
+        # but don't set jsize if mkfsoptions indicates a separate journal device
+        if jsize == 0 and jdev(mkfsoptions) == '':
+	    if devsize == 0:
                 if not is_block(dev):
                     ret, out = runcmd("ls -l %s" %dev)
                     devsize = int(string.split(out[0])[4]) / 1024
                 else:
+                    # sfdisk works for symlink, hardlink, and realdev
                     ret, out = runcmd("sfdisk -s %s" %dev)
-                    devsize = int(out[0])
+                    if not ret:
+                        devsize = int(out[0])
+                    else:
+                        # sfdisk -s will fail for too large block device,
+                        # then, read the size of partition from /proc/partitions
+                                                                                                               
+                        # get the realpath of the device
+                        # it may be the real device, such as /dev/hda7
+                        # or the hardlink created via mknod for a device
+                        if 'realpath' in dir(os.path):
+                            real_dev = os.path.realpath(dev)
+                        else:
+                            real_dev = dev
+                            link_count = 0
+                            while os.path.islink(real_dev) and (link_count < 20):
+                                link_count = link_count + 1
+                                dev_link = os.readlink(real_dev)
+                                if os.path.isabs(dev_link):
+                                    real_dev = dev_link
+                                else:
+                                    real_dev = os.path.join(os.path.dirname(real_dev), dev_link)
+                                if link_count > 19:
+                                    panic("Entountered too many symbolic links resolving block device:", dev)
+                                                                                                               
+                        # get the major and minor number of the realpath via ls
+                        # it seems python(os.stat) does not return
+                        # the st_rdev member of the stat structure
+                        ret, out = runcmd("ls -l %s" %real_dev)
+                        major = string.split(string.split(out[0])[4], ",")[0]
+                        minor = string.split(out[0])[5]
+                                                                                                               
+                        # get the devsize from /proc/partitions with the major and minor number
+                        ret, out = runcmd("cat /proc/partitions")
+                        for line in out:
+                            if len(line) > 1:
+                                if string.split(line)[0] == major and string.split(line)[1] == minor:
+                                    devsize = int(string.split(line)[2])
+                                    break
+
             if devsize > 1024 * 1024:
                 jsize = ((devsize / 102400) * 4)
             if jsize > 400:
@@ -780,6 +844,15 @@ def mkfs(dev, devsize, fstype, jsize, isize, mkfsoptions, isblock=1):
         mkfs = 'mkfs.ext2 -j -b 4096 '
         if not isblock or config.force:
             mkfs = mkfs + ' -F '
+        if jdev(mkfsoptions) != '':
+            jmkfs = 'mkfs.ext2 -b 4096 -O journal_dev '
+            if config.force:
+                jmkfs = jmkfs + '-F '
+            jmkfs = jmkfs + jdev(mkfsoptions)
+            (ret, out) = run (jmkfs)
+            if ret:
+                panic("Unable format journal device:", jdev(mkfsoptions), string.join(out))
+
     elif fstype == 'reiserfs':
         # reiserfs journal size is in blocks
         if jsize:  jopt = "--journal_size %d" %(jsize,)
@@ -942,7 +1015,7 @@ def sys_get_local_nid(net_type, wildcard, cluster_id):
 def sys_get_local_address(net_type, wildcard, cluster_id):
     """Return the local address for the network type."""
     local = ""
-    if net_type in ('tcp',):
+    if net_type in ('tcp','openib',):   
         if  ':' in wildcard:
             iface, star = string.split(wildcard, ':')
             local = if2addr(iface)
@@ -1154,9 +1227,6 @@ class Network(Module):
         self.nid = self.db.get_val('nid', '*')
         self.cluster_id = self.db.get_val('clusterid', "0")
         self.port = self.db.get_val_int('port', 0)
-        self.send_mem = self.db.get_val_int('sendmem', DEFAULT_TCPBUF)
-        self.recv_mem = self.db.get_val_int('recvmem', DEFAULT_TCPBUF)
-        self.irq_affinity = self.db.get_val_int('irqaffinity', 0)
 
         if '*' in self.nid:
             self.nid = sys_get_local_nid(self.net_type, self.nid, self.cluster_id)
@@ -1186,6 +1256,8 @@ class Network(Module):
             self.add_portals_module("knals/qswnal", 'kqswnal')
         if self.net_type == 'gm':
             self.add_portals_module("knals/gmnal", 'kgmnal')
+        if self.net_type == 'openib':
+            self.add_portals_module("knals/openibnal", 'kopenibnal')
 
     def nid_to_uuid(self, nid):
         return "NID_%s_UUID" %(nid,)
@@ -1250,9 +1322,10 @@ class RouteTable(Module):
 
     def server_for_route(self, net_type, gw, gw_cluster_id, tgt_cluster_id,
                          lo, hi):
-        # only setup connections for tcp NALs
-        srvdb = None
-        if not net_type in ('tcp',):
+        # only setup connections for tcp and openib NALs
+	srvdb = None
+        
+	if not net_type in ('tcp','openib'):
             return None
 
         # connect to target if route is to single node and this node is the gw
@@ -1307,30 +1380,6 @@ class RouteTable(Module):
                 e.dump()
                 cleanup_error(e.rc)
 
-class Management(Module):
-    def __init__(self, db):
-        Module.__init__(self, 'MGMT', db)
-        self.add_lustre_module('lvfs', 'lvfs')
-        self.add_lustre_module('obdclass', 'obdclass')
-        self.add_lustre_module('ptlrpc', 'ptlrpc')
-        self.add_lustre_module('mgmt', 'mgmt_svc')
-
-    def prepare(self):
-        if not config.record and is_prepared(self.name):
-            return
-        self.info()
-        lctl.newdev("mgmt", self.name, self.uuid)
-
-    def safe_to_clean(self):
-        return 1
-
-    def cleanup(self):
-        if is_prepared(self.name):
-            Module.cleanup(self)
-
-    def correct_level(self, level, op=None):
-        return level
-
 # This is only needed to load the modules; the LDLM device
 # is now created automatically.
 class LDLM(Module):
@@ -1363,6 +1412,7 @@ class LOV(Module):
         self.devlist = self.db.get_lov_tgts('lov_tgt')
         self.stripe_cnt = self.db.get_val_int('stripecount', len(self.devlist))
         self.osclist = []
+	self.obdlist = [] 
         self.desc_uuid = self.uuid
         self.uuid = generate_client_uuid(self.name)
         self.fs_name = fs_name
@@ -1375,7 +1425,8 @@ class LOV(Module):
         for (obd_uuid, index, gen, active) in self.devlist:
             if obd_uuid == '':
                 continue
-            obd = self.db.lookup(obd_uuid)
+	    self.obdlist.append(obd_uuid)
+	    obd = self.db.lookup(obd_uuid)
             osc = get_osc(obd, self.uuid, fs_name)
             if osc:
                 self.osclist.append((osc, index, gen, active))
@@ -1392,7 +1443,8 @@ class LOV(Module):
                   self.stripe_off, self.pattern, self.devlist,
                   self.mds_name)
         lctl.lov_setup(self.name, self.uuid, self.desc_uuid,  self.stripe_cnt,
-                       self.stripe_sz, self.stripe_off, self.pattern)
+                       self.stripe_sz, self.stripe_off, self.pattern,
+		       string.join(self.obdlist))
         for (osc, index, gen, active) in self.osclist:
             target_uuid = osc.target_uuid
             try:
@@ -1568,8 +1620,12 @@ class MDSDEV(Module):
             lov = LOV(self.db.lookup(lov_uuid), lov_uuid, 'FS_name', config_only = 1)
 
             # default stripe count controls default inode_size
-            stripe_count = lov.stripe_cnt
-            if stripe_count > 77:
+            if (lov.stripe_cnt > 0):
+                stripe_count = lov.stripe_cnt
+            else:
+                stripe_count = len(lov.devlist)
+
+	    if stripe_count > 77:
                 self.inode_size = 4096
             elif stripe_count > 35:
                 self.inode_size = 2048
@@ -2062,16 +2118,6 @@ class OSD(Module):
     def correct_level(self, level, op=None):
         return level
 
-def mgmt_uuid_for_fs(mtpt_name):
-    if not mtpt_name:
-        return ''
-    mtpt_db = toplustreDB.lookup_name(mtpt_name)
-    fs_uuid = mtpt_db.get_first_ref('filesystem')
-    fs = toplustreDB.lookup(fs_uuid)
-    if not fs:
-        return ''
-    return fs.get_first_ref('mgmt')
-
 # Generic client module, used by OSC and MDC
 class Client(Module):
     def __init__(self, tgtdb, uuid, module, fs_name, self_name=None,
@@ -2080,8 +2126,9 @@ class Client(Module):
         self.target_uuid = tgtdb.getUUID()
         self.db = tgtdb
         self.active = 1
-
-        self.tgt_dev_uuid = get_active_target(tgtdb)
+	self.backup_targets = []
+        
+	self.tgt_dev_uuid = get_active_target(tgtdb)
         if not self.tgt_dev_uuid:
             panic("No target device found for target(1):", self.target_name)
 
@@ -2098,11 +2145,8 @@ class Client(Module):
             self.name = self_name
         self.uuid = uuid
         self.lookup_server(self.tgt_dev_uuid)
-        mgmt_uuid = mgmt_uuid_for_fs(fs_name)
-        if mgmt_uuid:
-            self.mgmt_name = mgmtcli_name_for_uuid(mgmt_uuid)
-        else:
-            self.mgmt_name = ''
+	
+	self.lookup_backup_targets()
         self.fs_name = fs_name
         if not module_dir:
             module_dir = module
@@ -2117,6 +2161,19 @@ class Client(Module):
         return self.name
     def get_servers(self):
         return self._server_nets
+    def lookup_backup_targets(self):
+        """ Lookup alternative network information """
+        prof_list = toplustreDB.get_refs('profile')
+        for prof_uuid in prof_list:
+            prof_db = toplustreDB.lookup(prof_uuid)
+            if not prof_db:
+                panic("profile:", prof_uuid, "not found.")
+            for ref_class, ref_uuid in prof_db.get_all_refs():
+                if ref_class in ('osd', 'mdsdev'):
+                    devdb = toplustreDB.lookup(ref_uuid)
+                    uuid = devdb.get_first_ref('target')
+                    if self.target_uuid == uuid and self.tgt_dev_uuid != ref_uuid:
+                        self.backup_targets.append(ref_uuid)
 
     def prepare(self, ignore_connect_failure = 0):
         self.info(self.target_uuid)
@@ -2143,8 +2200,23 @@ class Client(Module):
                 debug("%s active" % self.target_uuid)
                 inactive_p = ""
             lctl.newdev(self.module, self.name, self.uuid,
-                        setup ="%s %s %s %s" % (self.target_uuid, srv.nid_uuid,
-                                                inactive_p, self.mgmt_name))
+                        setup ="%s %s %s" % (self.target_uuid, srv.nid_uuid,
+                                                inactive_p))
+        for tgt_dev_uuid in self.backup_targets:
+            this_nets = get_ost_net(toplustreDB, tgt_dev_uuid)
+            if len(this_nets) == 0:
+                panic ("Unable to find a server for:", tgt_dev_uuid)
+            srv = choose_local_server(this_nets)
+            if srv:
+                lctl.connect(srv)
+            else:
+                routes = find_route(this_nets);
+                if len(routes) == 0:
+                    panic("no route to", tgt_dev_uuid)
+                for (srv, r) in routes:
+                    lctl.add_route_host(r[0]. srv.nid_uuid, r[1], r[3])
+            if srv:
+                lctl.add_conn(self.name, srv.nid_uuid);
 
     def cleanup(self):
         if is_prepared(self.name):
@@ -2161,6 +2233,16 @@ class Client(Module):
                 e.dump()
                 cleanup_error(e.rc)
 
+            for tgt_dev_uuid in self.backup_targets:
+                this_net = get_ost_net(toplustreDB, tgt_dev_uuid)
+                srv = choose_local_server(this_net)
+                if srv:
+                    lctl.disconnect(srv)
+                else:
+                    for (srv, r) in find_route(this_net):
+                        lctl.del_route_host(r[0]. srv.nid_uuid, r[1], r[3])
+
+
     def correct_level(self, level, op=None):
         return level
 
@@ -2186,14 +2268,6 @@ class OSC(Client):
     def permits_inactive(self):
         return 1
 
-def mgmtcli_name_for_uuid(uuid):
-    return 'MGMTCLI_%s' % uuid
-
-class ManagementClient(Client):
-    def __init__(self, db, uuid):
-        Client.__init__(self, db, uuid, 'mgmt_cli', '',
-                        self_name = mgmtcli_name_for_uuid(db.getUUID()),
-                        module_dir = 'mgmt')
 class VLOV(Module):
     def __init__(self, db, uuid, fs_name, name_override = None, config_only = None):
         Module.__init__(self, 'VLOV', db)
@@ -2457,6 +2531,24 @@ def generate_client_uuid(name):
                                                int(random.random() * 1048576))
         return client_uuid[:36]
 
+def my_rstrip(s, chars):
+    """my_rstrip(s, chars) -> strips any instances of the characters
+    found in chars from the right side of string s"""
+    # XXX required because python versions pre 2.2.3 don't allow
+    #string.rstrip() to take alternate char lists
+    import string
+    ns=s
+    try:
+        ns = string.rstrip(s, '/')
+    except TypeError, e:
+        for i in range(len(s) - 1, 0, -1):
+            if s[i] in chars:
+                continue
+            else:
+                ns = s[0:i+1]
+                break
+    return ns
+
 class Mountpoint(Module):
     def __init__(self,db):
         Module.__init__(self, 'MTPT', db)
@@ -2468,7 +2560,6 @@ class Mountpoint(Module):
 	if not self.mds_uuid:
 	    self.mds_uuid = fs.get_first_ref('mds')
         self.obd_uuid = fs.get_first_ref('obd')
-        self.mgmt_uuid = fs.get_first_ref('mgmt')
         client_uuid = generate_client_uuid(self.name)
 
         ost = self.db.lookup(self.obd_uuid)
@@ -2486,19 +2577,11 @@ class Mountpoint(Module):
         self.vosc = VOSC(ost, client_uuid, self.name)
 	self.vmdc = VMDC(mds, client_uuid, self.name)
         
-        if self.mgmt_uuid:
-            self.mgmtcli = ManagementClient(db.lookup(self.mgmt_uuid),
-                                            client_uuid)
-        else:
-            self.mgmtcli = None
-
     def prepare(self):
         if not config.record and fs_is_mounted(self.path):
             log(self.path, "already mounted.")
             return
         run_acceptors()
-        if self.mgmtcli:
-            self.mgmtcli.prepare()
         self.vosc.prepare()
         self.vmdc.prepare()
         vmdc_name = self.vmdc.get_name()
@@ -2550,20 +2633,14 @@ class Mountpoint(Module):
 
         self.vmdc.cleanup()
         self.vosc.cleanup()
-        if self.mgmtcli:
-            self.mgmtcli.cleanup()
 
     def load_module(self):
-        if self.mgmtcli:
-            self.mgmtcli.load_module()
         self.vosc.load_module()
         Module.load_module(self)
 
     def cleanup_module(self):
         Module.cleanup_module(self)
         self.vosc.cleanup_module()
-        if self.mgmtcli:
-            self.mgmtcli.cleanup_module()
 
     def correct_level(self, level, op=None):
         return level
@@ -2597,8 +2674,6 @@ def getServiceLevel(self):
         ret = 6
     elif type in ('ldlm',):
         ret = 20
-    elif type in ('mgmt',):
-        ret = 25
     elif type in ('osd', 'cobd'):
         ret = 30
     elif type in ('mdsdev',):
@@ -2666,9 +2741,7 @@ def find_local_clusters(node_db):
         if srv.port > 0:
             if acceptors.has_key(srv.port):
                 panic("duplicate port:", srv.port)
-            acceptors[srv.port] = AcceptorHandler(srv.port, srv.net_type,
-                                                  srv.send_mem, srv.recv_mem,
-                                                  srv.irq_affinity)
+	    acceptors[srv.port] = AcceptorHandler(srv.port, srv.net_type)
 
 # This node is a gateway.
 is_router = 0
@@ -2789,8 +2862,6 @@ def newService(db):
         n = Mountpoint(db)
     elif type == 'echoclient':
         n = ECHO_CLIENT(db)
-    elif type == 'mgmt':
-        n = Management(db)
     elif type == 'lmv':
         n = LMV(db)
     else:
@@ -2809,8 +2880,8 @@ def for_each_profile(db, prof_list, operation):
     for prof_uuid in prof_list:
         prof_db = db.lookup(prof_uuid)
         if not prof_db:
-            panic("profile:", profile, "not found.")
-        services = getServices(prof_db)
+            panic("profile:", prof_uuid, "not found.")
+	services = getServices(prof_db)
         operation(services)
 
 def magic_get_osc(db, rec, lov):
@@ -3034,11 +3105,11 @@ def doHost(lustreDB, hosts):
     prof_list = node_db.get_refs('profile')
 
     if config.write_conf:
-        lustreDB.close()
         for_each_profile(node_db, prof_list, doModules)
         sys_make_devices()
         for_each_profile(node_db, prof_list, doWriteconf)
         for_each_profile(node_db, prof_list, doUnloadModules)
+        lustreDB.close()
 
     elif config.recover:
         if not (config.tgt_uuid and config.client_uuid and config.conn_uuid):
@@ -3187,6 +3258,23 @@ def sys_set_timeout(timeout):
         lctl.set_timeout(timeout)
 
 def sys_tweak_socknal ():
+    # reserve at least 8MB, or we run out of RAM in skb_alloc under read
+    if sys_get_branch() == '2.6':
+        fp = open('/proc/meminfo')
+        lines = fp.readlines()
+        fp.close()
+        memtotal = 131072
+        for l in lines:
+            a = string.split(l)
+            if a[0] == 'MemTotal:':
+                memtotal = a[1]
+	        debug("memtotal" + memtotal)
+	if int(memtotal) < 262144:
+	    minfree = int(memtotal) / 16
+	else:
+	    minfree = 32768
+	debug("+ minfree ", minfree)
+        sysctl("vm/min_free_kbytes", minfree)
     if config.single_socket:
         sysctl("socknal/typed", 0)
 
@@ -3195,7 +3283,7 @@ def sys_optimize_elan ():
                  "/proc/qsnet/elan3/config/eventint_punt_loops",
                  "/proc/qsnet/elan4/config/elan4_mainint_punt_loops"]
     for p in procfiles:
-        if os.access(p, os.R_OK):
+        if os.access(p, os.W_OK):
             run ("echo 1 > " + p)
 
 def sys_set_ptldebug(ptldebug):
diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c
index cc6298233d..cd70a94705 100644
--- a/lustre/utils/lctl.c
+++ b/lustre/utils/lctl.c
@@ -67,12 +67,19 @@ command_t cmdlist[] = {
          "usage: --net <tcp/elan/myrinet> <command>"},
         {"network", jt_ptl_network, 0, "commands that follow apply to net\n"
          "usage: network <tcp/elan/myrinet>"},
-        {"autoconn_list", jt_ptl_print_autoconnects, 0, "print autoconnect entries\n"
-         "usage: print_autoconns"},
-        {"add_autoconn", jt_ptl_add_autoconnect, 0, "add an autoconnect entry\n"
-         "usage: add_autoconn <nid> <host> <port> [ise]"},
-        {"del_autoconn", jt_ptl_del_autoconnect, 0, "remove an autoconnect entry\n"
-         "usage: del_autoconn [<nid>] [<host>] [ks]"},
+        
+        {"interface_list", jt_ptl_print_interfaces, 0, "print interface entries\n"
+         "usage: interface_list"},
+        {"add_interface", jt_ptl_add_interface, 0, "add interface entry\n"
+         "usage: add_interface ip [netmask]"},
+        {"del_interface", jt_ptl_del_interface, 0, "del interface entry\n"
+         "usage: del_interface [ip]"},
+        {"peer_list", jt_ptl_print_peers, 0, "print peer entries\n"
+         "usage: peer_list"},
+        {"add_peer", jt_ptl_add_peer, 0, "add an peer entry\n"
+         "usage: add_peer <nid> <host> <port>"},
+        {"del_peer", jt_ptl_del_peer, 0, "remove an peer entry\n"
+         "usage: del_peer [<nid>] [<host>] [ks]"},
         {"conn_list", jt_ptl_print_connections, 0, "print all the connected remote nid\n"
          "usage: conn_list"},
         {"connect", jt_ptl_connect, 0, "connect to a remote nid\n"
@@ -104,15 +111,6 @@ command_t cmdlist[] = {
          "usage: set_route <gateway> <up/down> [<time>]"},
         {"route_list", jt_ptl_print_routes, 0, "print the portals routing table\n"
          "usage: route_list"},
-        {"recv_mem", jt_ptl_rxmem, 0, "set socket receive buffer size, "
-         "if size is omited the current size is reported.\n"
-         "usage: recv_mem [size]"},
-        {"send_mem", jt_ptl_txmem, 0, "set socket send buffer size, "
-         "if size is omited the current size is reported.\n"
-         "usage: send_mem [size]"},
-        {"nagle", jt_ptl_nagle, 0, "enable/disable nagle, omitting the "
-         "argument will cause the current nagle setting to be reported.\n"
-         "usage: nagle [on/off]"},
         {"fail", jt_ptl_fail_nid, 0, "fail/restore communications.\n"
          "Omitting the count means indefinitely, 0 means restore, "
          "otherwise fail 'count' messages.\n"
@@ -197,6 +195,9 @@ command_t cmdlist[] = {
         {"test_getattr", jt_obd_test_getattr, 0,
          "do <num> getattrs (on OST object <objid> (objid+1 on each thread))\n"
          "usage: test_getattr <num> [verbose [[t]objid]]"},
+        {"test_setattr", jt_obd_test_setattr, 0,
+         "do <num> setattrs (on OST object <objid> (objid+1 on each thread))\n"
+         "usage: test_setattr <num> [verbose [[t]objid]]"},
         {"test_brw", jt_obd_test_brw, 0,
          "do <num> bulk read/writes (<npages> per I/O, on OST object <objid>)\n"
          "usage: test_brw [t]<num> [write [verbose [npages [[t]objid]]]]"},
@@ -241,6 +242,10 @@ command_t cmdlist[] = {
          "usage: set_timeout <secs>\n"},
         {"set_lustre_upcall", jt_lcfg_set_lustre_upcall, 0,
          "usage: set_lustre_upcall </full/path/to/upcall> \n"},
+        {"add_conn ", jt_lcfg_add_conn, 0,
+         "usage: add_conn <conn_uuid> [priority]\n"},
+        {"del_conn ", jt_lcfg_del_conn, 0,
+         "usage: del_conn <conn_uuid> \n"},
         {"lsync", jt_obd_reint_sync, 0,
          "usage: lsync\n"},  
         {"cache_on", jt_obd_cache_on, 0,
diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c
index bb563caea1..f8e3c4eb8b 100644
--- a/lustre/utils/liblustreapi.c
+++ b/lustre/utils/liblustreapi.c
@@ -373,7 +373,7 @@ int llapi_file_get_stripe(char *path, struct lov_user_md *lum)
                 if (dname == NULL)
                         return ENOMEM;
                 strncpy(dname, path, fname - path);
-                dname[fname - path + 1] = '\0';
+                dname[fname - path] = '\0';
                 fname++;
         }
 
diff --git a/lustre/utils/llanalyze b/lustre/utils/llanalyze
index 40166a52f6..5d3180d9f6 100644
--- a/lustre/utils/llanalyze
+++ b/lustre/utils/llanalyze
@@ -37,7 +37,7 @@ $subsys->{LOV} = 1 << 18;
 $subsys->{GMNAL} = 1 << 19;
 $subsys->{PTLROUTER} = 1 << 20;
 $subsys->{COBD} = 1 << 21;
-$subsys->{IBNAL} = 1 << 22;
+$subsys->{OPENIBNAL} = 1 << 22;
 $subsys->{SM} = 1 << 23;
 $subsys->{ASOBD} = 1 << 24;
 $subsys->{LMV} = 1 << 25;
@@ -339,7 +339,7 @@ while (<LOG>) {
                     $linesubsys == $subsys->{PORTALS} ||
                     $linesubsys == $subsys->{SOCKNAL} ||
                     $linesubsys == $subsys->{QSWNAL} ||
-                    $linesubsys == $subsys->{IBNAL} ||
+		    $linesubsys == $subsys->{OPENIBNAL} ||
                     $linesubsys == $subsys->{GMNAL}));
 	if(!$entering_rpc) {entering_rpc($_);}
 	if(!$leaving_rpc) {leaving_rpc($_);}
diff --git a/lustre/utils/llmount.c b/lustre/utils/llmount.c
index 198e30e5b9..8ab57054f2 100644
--- a/lustre/utils/llmount.c
+++ b/lustre/utils/llmount.c
@@ -25,12 +25,14 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <errno.h>
 #include <string.h>
 #include <sys/mount.h>
 #include <mntent.h>
 #define _GNU_SOURCE
 #include <getopt.h>
+#include <sys/utsname.h>
 
 #include "obdctl.h"
 #include <portals/ptlctl.h>
@@ -132,7 +134,7 @@ print_options(struct lustre_mount_data *lmd)
         printf("port:            %d\n", lmd->lmd_port);
 
         for (i = 0; i < route_index; i++)
-                printf("route:           0x%llx : 0x%llx - 0x%llx\n",
+                printf("route:           "LPX64" : "LPX64" - "LPX64"\n",
                        routes[i].gw, routes[i].lo, routes[i].hi);
 
         return 0;
@@ -246,9 +248,6 @@ int parse_options(char * options, struct lustre_mount_data *lmd)
                         } else if (!strcmp(opt, "port")) {
                                 lmd->lmd_port = val;
                         }
-                        else if (!strcmp(opt, "clone")) {
-                                lmd->lmd_clone_index = val;
-                        } 
                 } else {
                         val = 1;
                         if (!strncmp(opt, "no", 2)) {
@@ -294,13 +293,43 @@ set_local(struct lustre_mount_data *lmd)
 
         memset(buf, 0, sizeof(buf));
 
-        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL) {
+        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL ||
+            lmd->lmd_nal == OPENIBNAL) {
+                struct utsname uts;
+
                 rc = gethostname(buf, sizeof(buf) - 1);
                 if (rc) {
-                        fprintf (stderr, "%s: can't get local buf: %d\n",
-                                 progname, rc);
+                        fprintf(stderr, "%s: can't get hostname: %s\n",
+                                progname, strerror(rc));
                         return rc;
                 }
+                rc = uname(&uts);
+                /* for 2.6 kernels, reserve at least 8MB free, or we will
+                 * go OOM during heavy read load */
+                if (rc == 0 && strncmp(uts.release, "2.6", 3) == 0) {
+                        int f, minfree = 32768;
+                        char name[40], val[40];
+                        FILE *meminfo;
+
+                        meminfo = fopen("/proc/meminfo", "r");
+                        if (meminfo != NULL) {
+                                while (fscanf(meminfo, "%s %s %*s\n", name, val) != EOF) {
+                                        if (strcmp(name, "MemTotal:") == 0) {
+                                                f = strtol(val, NULL, 0);
+                                                if (f > 0 && f < 8 * minfree)
+                                                        minfree = f / 16;
+                                                break;
+                                        }
+                                }
+                                fclose(meminfo);
+                        }
+                        f = open("/proc/sys/vm/min_free_kbytes", O_WRONLY);
+                        if (f >= 0) {
+                                sprintf(val, "%d", minfree);
+                                write(f, val, strlen(val));
+                                close(f);
+                        }
+                 }
         } else if (lmd->lmd_nal == QSWNAL) {
                 char *pfiles[] = {"/proc/qsnet/elan3/device0/position",
                                   "/proc/qsnet/elan4/device0/position",
@@ -334,8 +363,9 @@ set_peer(char *hostname, struct lustre_mount_data *lmd)
 {
         ptl_nid_t nid = 0;
         int rc;
-
-        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL) {
+        
+        if (lmd->lmd_nal == SOCKNAL || lmd->lmd_nal == TCPNAL ||
+            lmd->lmd_nal == OPENIBNAL) {
                 if (lmd->lmd_server_nid == PTL_NID_ANY) {
                         if (ptl_parse_nid (&nid, hostname) != 0) {
                                 fprintf (stderr, "%s: can't parse NID %s\n",
@@ -378,12 +408,12 @@ build_data(char *source, char *options, struct lustre_mount_data *lmd)
         int rc;
 
         if (lmd_bad_magic(lmd))
-                return -EINVAL;
+                return 4;
 
         if (strlen(source) > sizeof(buf) + 1) {
                 fprintf(stderr, "%s: host:/mds/profile argument too long\n",
                         progname);
-                return -EINVAL;
+                return 1;
         }
         strcpy(buf, source);
         if ((s = strchr(buf, ':'))) {
@@ -400,13 +430,13 @@ build_data(char *source, char *options, struct lustre_mount_data *lmd)
                         fprintf(stderr, "%s: directory to mount not in "
                                 "host:/mds/profile format\n",
                                 progname);
-                        return(-1);
+                        return(1);
                 }
         } else {
                 fprintf(stderr, "%s: "
                         "directory to mount not in host:/mds/profile format\n",
                         progname);
-                return(-1);
+                return(1);
         }
 
         rc = parse_options(options, lmd);
@@ -422,13 +452,13 @@ build_data(char *source, char *options, struct lustre_mount_data *lmd)
                 return rc;
         if (strlen(mds) > sizeof(lmd->lmd_mds) + 1) {
                 fprintf(stderr, "%s: mds name too long\n", progname);
-                return(-1);
+                return(1);
         }
         strcpy(lmd->lmd_mds, mds);
 
         if (strlen(profile) > sizeof(lmd->lmd_profile) + 1) {
                 fprintf(stderr, "%s: profile name too long\n", progname);
-                return(-1);
+                return(1);
         }
         strcpy(lmd->lmd_profile, profile);
 
@@ -490,9 +520,9 @@ static int set_routes(struct lustre_mount_data *lmd) {
               rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_NAL_CMD, &data);
               if (rc != 0) {
                       fprintf(stderr, "%s: Unable to add route "
-                              "0x%llx : 0x%llx - 0x%llx\n[%d] %s\n",
-                               progname, routes[i].gw, routes[i].lo,
-                               routes[i].hi, errno, strerror(errno));
+                              LPX64" : "LPX64" - "LPX64"\n[%d] %s\n",
+                              progname, routes[i].gw, routes[i].lo,
+                              routes[i].hi, errno, strerror(errno));
                       err = -1;
                       break;
               }
@@ -578,12 +608,12 @@ int main(int argc, char *const argv[])
         init_options(&lmd);
         rc = build_data(source, options, &lmd);
         if (rc) {
-                exit(1);
+                exit(rc);
         }
 
         rc = set_routes(&lmd);
         if (rc) {
-                exit(1);
+                exit(rc);
         }
 
         if (debug) {
@@ -598,8 +628,8 @@ int main(int argc, char *const argv[])
                 if (rc == ENODEV)
                         fprintf(stderr, "Are the lustre modules loaded?\n"
                              "Check /etc/modules.conf and /proc/filesystems\n");
-        } else {
-                update_mtab_entry(source, target, "lustre", options, 0, 0, 0);
+                return 2;
         }
-        return rc;
+        update_mtab_entry(source, target, "lustre", options, 0, 0, 0);
+        return 0;
 }
diff --git a/lustre/utils/lmc b/lustre/utils/lmc
index d03fd013aa..3fea4e24e9 100755
--- a/lustre/utils/lmc
+++ b/lustre/utils/lmc
@@ -74,7 +74,7 @@ Object creation command summary:
   --node node_name
   --nid nid
   --cluster_id
-  --nettype tcp|elan|gm
+  --nettype tcp|elan|gm|openib
   --hostaddr addr
   --port port
   --tcpbuf size
@@ -93,6 +93,7 @@ Object creation command summary:
   --nspath
   --journal_size size
   --inode_size size
+  --mdsuuid uuid
   --lmv lmv_name
   --mkfsoptions options
   --mountfsoptions options
@@ -200,11 +201,9 @@ lmc_options = [
     ('subsystem', "Specify which Lustre subsystems have debug output recorded in the log",  PARAM),
 
     # network
-    ('nettype', "Specify the network type. This can be tcp/elan/gm.", PARAM),
+    ('nettype', "Specify the network type. This can be tcp/elan/gm/openib.", PARAM),
     ('nid', "Give the network ID, e.g ElanID/IP Address as used by portals.", PARAM),
-    ('tcpbuf', "Optional argument to specify the TCP buffer size.", PARAM, "0"),
     ('port', "Optional argument to specify the TCP port number.", PARAM, DEFAULT_PORT),
-    ('irq_affinity', "Optional argument.", PARAM, 0),
     ('hostaddr', "", PARAM,""),
     ('cluster_id', "Specify the cluster ID", PARAM, "0"),
 
@@ -232,9 +231,10 @@ lmc_options = [
     ('backfstype', "Optional argument to specify the backing filesystem type.", PARAM, "ext3"),
     ('mkfsoptions', "Optional argument to mkfs.", PARAM, ""),
     ('mountfsoptions', "Optional argument to mount fs.", PARAM, ""),
+    ('ostuuid', "Optional argument to specify OST UUID", PARAM,""),
+    ('mdsuuid', "Optional argument to specify MDS UUID", PARAM,""),
     ('root_squash', "MDS squash root to appointed uid.", PARAM, ""),
     ('no_root_squash', "Don't squash root for appointed nid.", PARAM, ""),
-    ('ostuuid', "", PARAM,""),
     ('nspath', "Local mount point of server namespace.", PARAM,""),
     ('format', ""),
     ('migrate', "used for offline migrate of an ost in conjunctio with add/delete"),
@@ -386,7 +386,7 @@ class GenConfig:
         return new
 
     def network(self, name, uuid, nid, cluster_id, net, hostaddr="",
-                port=0, tcpbuf=0, irq_aff=0):
+                port=0):
         """create <network> node"""
         network = self.newService("network", name, uuid)
         network.setAttribute("nettype", net);
@@ -396,13 +396,8 @@ class GenConfig:
             self.addElement(network, "hostaddr", hostaddr)
         if port:
             self.addElement(network, "port", "%d" %(port))
-        if tcpbuf:
-            self.addElement(network, "sendmem", "%d" %(tcpbuf))
-            self.addElement(network, "recvmem", "%d" %(tcpbuf))
-        if irq_aff:
-            self.addElement(network, "irqaffinity", "%d" %(irq_aff))
-
-        return network
+        
+	return network
 
     def routetbl(self, name, uuid):
         """create <routetbl> node"""
@@ -927,12 +922,8 @@ def add_net(gen, lustre, options):
 
     if net_type in ('tcp',):
         port = get_option_int(options, 'port')
-        tcpbuf = get_option_int(options, 'tcpbuf')
-        irq_aff = get_option_int(options, 'irq_affinity')
-    elif net_type in ('elan', 'gm'):
+    elif net_type in ('elan', 'gm', 'openib'):
         port = 0
-        tcpbuf = 0
-        irq_aff = 0
     else:
         print "Unknown net_type: ", net_type
         sys.exit(2)
@@ -947,7 +938,7 @@ def add_net(gen, lustre, options):
     net_name = new_name('NET_'+ node_name +'_'+ net_type)
     net_uuid = new_uuid(net_name)
     node.appendChild(gen.network(net_name, net_uuid, nid, cluster_id, net_type,
-                                 hostaddr, port, tcpbuf, irq_aff))
+                                 hostaddr, port))
     node_add_profile(gen, node, "network", net_uuid)
 
 
@@ -997,7 +988,12 @@ def add_mds(gen, lustre, options):
 
     mds_uuid = name2uuid(lustre, mds_name, 'mds', fatal=0)
     if not mds_uuid:
-        mds_uuid = new_uuid(mds_name)
+        mds_uuid = get_option(options, 'mdsuuid')
+        if mds_uuid:
+            if lookup(lustre, mds_uuid):
+                error("Duplicate MDS UUID:", mds_uuid)
+        else:
+            mds_uuid = new_uuid(mds_name)
         mds = gen.mds(mds_name, mds_uuid, mdd_uuid, options.group)
         lustre.appendChild(mds)
         if lmv_name:
diff --git a/lustre/utils/lustre_cfg.c b/lustre/utils/lustre_cfg.c
index e8d989d7dc..ca170732e9 100644
--- a/lustre/utils/lustre_cfg.c
+++ b/lustre/utils/lustre_cfg.c
@@ -344,20 +344,20 @@ int jt_lcfg_lov_setup(int argc, char **argv)
         struct lov_desc desc;
         int rc;
         char *end;
-
+                                                                                                                                                                                                     
         /* argv: lov_setup <LOV uuid> <stripe count> <stripe size>
          *                 <stripe offset> <pattern> [ <max tgt index> ]
          */
-        if (argc < 6 || argc > 7)
+        if (argc <= 6)
                 return CMD_HELP;
-
+                                                                                                                                                                                                     
         if (strlen(argv[1]) > sizeof(desc.ld_uuid) - 1) {
                 fprintf(stderr,
                         "error: %s: LOV uuid '%s' longer than "LPSZ" chars\n",
                         jt_cmdname(argv[0]), argv[1], sizeof(desc.ld_uuid) - 1);
                 return -EINVAL;
         }
-
+                                                                                                                                                                                                     
         memset(&desc, 0, sizeof(desc));
         obd_str2uuid(&desc.ld_uuid, argv[1]);
         desc.ld_default_stripe_count = strtoul(argv[2], &end, 0);
@@ -366,7 +366,7 @@ int jt_lcfg_lov_setup(int argc, char **argv)
                         jt_cmdname(argv[0]), argv[2]);
                 return CMD_HELP;
         }
-
+                                                                                                                                                                                                     
         desc.ld_default_stripe_size = strtoull(argv[3], &end, 0);
         if (*end) {
                 fprintf(stderr, "error: %s: bad default stripe size '%s'\n",
@@ -397,14 +397,9 @@ int jt_lcfg_lov_setup(int argc, char **argv)
                         jt_cmdname(argv[0]), argv[5]);
                 return CMD_HELP;
         }
-
-        if (argc == 7) {
-                desc.ld_tgt_count = strtoul(argv[6], &end, 0);
-                if (*end) {
-                        fprintf(stderr, "error: %s: bad target count '%s'\n",
-                                jt_cmdname(argv[0]), argv[6]);
-                        return CMD_HELP;
-                }
+                                                                                                                                                                                                     
+        if (argc > 7) {
+                desc.ld_tgt_count = argc - 6;
                 if (desc.ld_default_stripe_count > desc.ld_tgt_count) {
                         fprintf(stderr,
                                 "error: %s: default stripe count %u > "
@@ -414,12 +409,12 @@ int jt_lcfg_lov_setup(int argc, char **argv)
                         return -EINVAL;
                 }
         }
-
+                                                                                                                                                                                                     
         LCFG_INIT(lcfg, LCFG_SETUP, lcfg_devname);
-
+                                                                                                                                                                                                     
         lcfg.lcfg_inllen1 = sizeof(desc);
         lcfg.lcfg_inlbuf1 = (char *)&desc;
-
+                                                                                                                                                                                                     
         rc = lcfg_ioctl(argv[0], OBD_DEV_ID, &lcfg);
         if (rc)
                 fprintf(stderr, "error: %s: ioctl error: %s\n",
@@ -644,4 +639,70 @@ int jt_lcfg_set_lustre_upcall(int argc, char **argv)
 
         return rc;
 }
+int jt_lcfg_add_conn(int argc, char **argv)
+{
+        struct lustre_cfg lcfg;
+        int priority;
+        int rc;
+
+        if (argc == 2)
+                priority = 0;
+        else if (argc == 3)
+                priority = 1;
+        else
+                return CMD_HELP;
+
+        if (lcfg_devname == NULL) {
+                fprintf(stderr, "%s: please use 'cfg_device name' to set the "
+                        "device name for config commands.\n",
+                        jt_cmdname(argv[0]));
+               return -EINVAL;
+        }
+
+        LCFG_INIT(lcfg, LCFG_ADD_CONN, lcfg_devname);
+
+        /* connection uuid */
+        lcfg.lcfg_inllen1 = strlen(argv[1]) + 1;
+        lcfg.lcfg_inlbuf1 = argv[1];
+        lcfg.lcfg_inllen2 = sizeof(int);
+        lcfg.lcfg_inlbuf2 = (char*) &priority;
+
+        rc = lcfg_ioctl(argv[0], OBD_DEV_ID, &lcfg);
+        if (rc < 0) {
+                fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+                        strerror(rc = errno));
+        }
+
+        return rc;
+}
+
+int jt_lcfg_del_conn(int argc, char **argv)
+{
+        struct lustre_cfg lcfg;
+        int rc;
+
+        if (argc != 2)
+                return CMD_HELP;
+
+        if (lcfg_devname == NULL) {
+                fprintf(stderr, "%s: please use 'cfg_device name' to set the "
+                        "device name for config commands.\n",
+                        jt_cmdname(argv[0]));
+               return -EINVAL;
+        }
+
+        LCFG_INIT(lcfg, LCFG_DEL_CONN, lcfg_devname);
+
+        /* connection uuid */
+        lcfg.lcfg_inllen1 = strlen(argv[1]) + 1;
+        lcfg.lcfg_inlbuf1 = argv[1];
+
+        rc = lcfg_ioctl(argv[0], OBD_DEV_ID, &lcfg);
+        if (rc < 0) {
+                fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
+                        strerror(rc = errno));
+        }
+
+        return rc;
+}
 
diff --git a/lustre/utils/lwizard b/lustre/utils/lwizard
index 4938f95e84..c080eaabf4 100755
--- a/lustre/utils/lwizard
+++ b/lustre/utils/lwizard
@@ -257,6 +257,21 @@ add_node()
 
     return 0 
 } 
+# save client node config into config file
+add_client_node()
+{
+    local node=$1
+    local nettype=$DEFAULT_NETTYPE
+
+    in_list "$node" "$NODE_LIST" && return 0
+    NODE_LIST="$NODE_LIST $node"
+
+    run_lmc --add node --node "$node"
+    run_lmc --add net --node "$node" --nid "*"  \
+        --nettype "$nettype"
+
+    return 0
+}
 
 # get hostname, device , device_id and device name 
 # from mds node 
@@ -285,7 +300,7 @@ create_config()
 	echo -n " $DEVICE_NAME"
 	case $DEVICE_NAME in
 	    mds*)
-		add_node "$HOST_NAME"
+		add_client_node "$DEVICE_NAME"
 		run_lmc --add mds \
 		    --node "$HOST_NAME" \
 		    --mds "$DEVICE_NAME" \
diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c
index 7490e5c4bb..2cf74f9adf 100644
--- a/lustre/utils/obd.c
+++ b/lustre/utils/obd.c
@@ -61,19 +61,27 @@
 #include "parser.h"
 #include <stdio.h>
 
-#define SHMEM_STATS 1
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <pthread.h>
+
+
 #define MAX_STRING_SIZE 128
 #define DEVICES_LIST "/proc/fs/lustre/devices"
 
-#if SHMEM_STATS
-# include <sys/ipc.h>
-# include <sys/shm.h>
-
-# define MAX_SHMEM_COUNT 1024
-static long long *shared_counters;
-static long long counter_snapshot[2][MAX_SHMEM_COUNT];
+#define MAX_THREADS 1024
+struct shared_data {
+        __u64 counters[MAX_THREADS];
+        __u64 offsets[MAX_THREADS];
+        int   running;
+        int   barrier;
+        pthread_mutex_t mutex;
+        pthread_cond_t  cond;
+};
+static struct shared_data *shared_data;
+static __u64 counter_snapshot[2][MAX_THREADS];
+static int prev_valid;
 struct timeval prev_time;
-#endif
 
 static int jt_recording;
 static char rawbuf[8192];
@@ -81,6 +89,7 @@ static char *buf = rawbuf;
 static int max = sizeof(rawbuf);
 
 static int thread;
+static int nthreads;
 
 static uint32_t cur_device = MAX_OBD_DEVICES;
 
@@ -230,7 +239,7 @@ int parse_devname(char *func, char *name)
                 /* Assume it's a number.  This means that bogus strings become
                  * 0.  I might care about that some day. */
                 ret = strtoul(name, NULL, 0);
-                printf("Selected device %d\n", ret);
+                //printf("Selected device %d\n", ret);
         }
 
         return ret;
@@ -428,25 +437,24 @@ int do_disconnect(char *func, int verbose)
         return 0;
 }
 
-#if SHMEM_STATS
 static void shmem_setup(void)
 {
         /* Create new segment */
-        int shmid = shmget(IPC_PRIVATE, sizeof(counter_snapshot[0]), 0600);
+        int shmid = shmget(IPC_PRIVATE, sizeof(*shared_data), 0600);
 
         if (shmid == -1) {
-                fprintf(stderr, "Can't create shared memory counters: %s\n",
+                fprintf(stderr, "Can't create shared data: %s\n",
                         strerror(errno));
                 return;
         }
 
         /* Attatch to new segment */
-        shared_counters = (long long *)shmat(shmid, NULL, 0);
-
-        if (shared_counters == (long long *)(-1)) {
-                fprintf(stderr, "Can't attach shared memory counters: %s\n",
+        shared_data = (struct shared_data *)shmat(shmid, NULL, 0);
+        
+        if (shared_data == (struct shared_data *)(-1)) {
+                fprintf(stderr, "Can't attach shared data: %s\n",
                         strerror(errno));
-                shared_counters = NULL;
+                shared_data = NULL;
                 return;
         }
 
@@ -454,47 +462,60 @@ static void shmem_setup(void)
          * Forks will inherit attached segments, so we should be OK.
          */
         if (shmctl(shmid, IPC_RMID, NULL) == -1) {
-                fprintf(stderr, "Can't destroy shared memory counters: %s\n",
+                fprintf(stderr, "Can't destroy shared data: %s\n",
                         strerror(errno));
         }
 }
 
-static inline void shmem_reset(void)
+static inline void shmem_reset(int total_threads)
 {
-        if (shared_counters == NULL)
+        if (shared_data == NULL)
                 return;
 
-        memset(shared_counters, 0, sizeof(counter_snapshot[0]));
+        memset(shared_data, 0, sizeof(*shared_data));
+        pthread_mutex_init(&shared_data->mutex, NULL);
+        pthread_cond_init(&shared_data->cond, NULL);
+
         memset(counter_snapshot, 0, sizeof(counter_snapshot));
-        gettimeofday(&prev_time, NULL);
+        prev_valid = 0;
+        shared_data->barrier = total_threads;
 }
 
 static inline void shmem_bump(void)
 {
-        if (shared_counters == NULL || thread <= 0 || thread > MAX_SHMEM_COUNT)
-                return;
+        static int bumped_running;
 
-        shared_counters[thread - 1]++;
+        if (shared_data == NULL || thread <= 0 || thread > MAX_THREADS)
+                return;
+        pthread_mutex_lock(&shared_data->mutex);
+        shared_data->counters[thread - 1]++;
+        if (!bumped_running)
+                shared_data->running++;
+        pthread_mutex_unlock(&shared_data->mutex);
+        bumped_running = 1;
 }
 
-static void shmem_snap(int n)
+static void shmem_snap(int total_threads, int live_threads)
 {
         struct timeval this_time;
         int non_zero = 0;
-        long long total = 0;
+        __u64 total = 0;
         double secs;
+        int running;
         int i;
 
-        if (shared_counters == NULL || n > MAX_SHMEM_COUNT)
+        if (shared_data == NULL || total_threads > MAX_THREADS)
                 return;
+        
+        pthread_mutex_lock(&shared_data->mutex);
+        memcpy(counter_snapshot[0], shared_data->counters,
+               total_threads * sizeof(counter_snapshot[0][0]));
+        running = shared_data->running;
+        pthread_mutex_unlock(&shared_data->mutex);
 
-        memcpy(counter_snapshot[1], counter_snapshot[0],
-               n * sizeof(counter_snapshot[0][0]));
-        memcpy(counter_snapshot[0], shared_counters,
-               n * sizeof(counter_snapshot[0][0]));
         gettimeofday(&this_time, NULL);
 
-        for (i = 0; i < n; i++) {
+        for (i = 0; i < total_threads; i++) {
                 long long this_count =
                         counter_snapshot[0][i] - counter_snapshot[1][i];
 
@@ -507,22 +528,19 @@ static void shmem_snap(int n)
         secs = (this_time.tv_sec + this_time.tv_usec / 1000000.0) -
                 (prev_time.tv_sec + prev_time.tv_usec / 1000000.0);
 
-        printf("%d/%d Total: %f/second\n", non_zero, n, total / secs);
-
+        if (prev_valid &&
+            live_threads == total_threads &&
+            secs > 0.0)                    /* someone screwed with the time? */
+                printf("%d/%d Total: %f/second\n", non_zero, total_threads, total / secs);
+                                                                                                                                                                                                     
+        memcpy(counter_snapshot[1], counter_snapshot[0],
+               total_threads * sizeof(counter_snapshot[0][0]));
         prev_time = this_time;
+        if (!prev_valid &&
+            running == total_threads)
+                prev_valid = 1;
 }
 
-#define SHMEM_SETUP()   shmem_setup()
-#define SHMEM_RESET()   shmem_reset()
-#define SHMEM_BUMP()    shmem_bump()
-#define SHMEM_SNAP(n)   shmem_snap(n)
-#else
-#define SHMEM_SETUP()
-#define SHMEM_RESET()
-#define SHMEM_BUMP()
-#define SHMEM_SNAP(n)
-#endif
-
 extern command_t cmdlist[];
 
 static int do_device(char *func, char *devname)
@@ -585,8 +603,18 @@ int jt_opt_device(int argc, char **argv)
         return rc;
 }
 
+static void parent_sighandler (int sig)
+{
+        return;
+}
+
 int jt_opt_threads(int argc, char **argv)
 {
+        sigset_t         saveset;
+        sigset_t         sigset;
+        struct sigaction sigact;
+        struct sigaction saveact1;
+        struct sigaction saveact2;
         __u64 threads, next_thread;
         int verbose;
         int rc = 0;
@@ -597,8 +625,8 @@ int jt_opt_threads(int argc, char **argv)
                 return CMD_HELP;
 
         threads = strtoull(argv[1], &end, 0);
-        if (*end) {
-                fprintf(stderr, "error: %s: invalid page count '%s'\n",
+        if (*end || threads > MAX_THREADS) {
+                fprintf(stderr, "error: %s: invalid thread count '%s'\n",
                         jt_cmdname(argv[0]), argv[1]);
                 return CMD_HELP;
         }
@@ -611,7 +639,15 @@ int jt_opt_threads(int argc, char **argv)
                 printf("%s: starting "LPD64" threads on device %s running %s\n",
                        argv[0], threads, argv[3], argv[4]);
 
-        SHMEM_RESET();
+        shmem_reset(threads);
+
+        sigemptyset(&sigset);
+        sigaddset(&sigset, SIGALRM);
+        sigaddset(&sigset, SIGCHLD);
+        sigprocmask(SIG_BLOCK, &sigset, &saveset);
+
+        nthreads = threads;
+
 
         for (i = 1, next_thread = verbose; i <= threads; i++) {
                 rc = fork();
@@ -620,6 +656,7 @@ int jt_opt_threads(int argc, char **argv)
                                 strerror(rc = errno));
                         break;
                 } else if (rc == 0) {
+                        sigprocmask(SIG_SETMASK, &saveset, NULL);
                         thread = i;
                         argv[2] = "--device";
                         return jt_opt_device(argc - 2, argv + 2);
@@ -632,45 +669,61 @@ int jt_opt_threads(int argc, char **argv)
         if (!thread) {          /* parent process */
                 int live_threads = threads;
 
+                sigemptyset(&sigset);
+                sigemptyset(&sigact.sa_mask);
+                sigact.sa_handler = parent_sighandler;
+                sigact.sa_flags = 0;
+
+                sigaction(SIGALRM, &sigact, &saveact1);
+                sigaction(SIGCHLD, &sigact, &saveact2);
+
                 while (live_threads > 0) {
                         int status;
                         pid_t ret;
 
-                        ret = waitpid(0, &status, verbose < 0 ? WNOHANG : 0);
-                        if (ret == 0) {
-                                if (verbose >= 0)
-                                        abort();
-
-                                sleep(-verbose);
-                                SHMEM_SNAP(threads);
-                                continue;
-                        }
-
-                        if (ret < 0) {
-                                fprintf(stderr, "error: %s: wait - %s\n",
-                                        argv[0], strerror(errno));
-                                if (!rc)
-                                        rc = errno;
-                        } else {
-                                /*
-                                 * This is a hack.  We _should_ be able to use
-                                 * WIFEXITED(status) to see if there was an
-                                 * error, but it appears to be broken and it
-                                 * always returns 1 (OK).  See wait(2).
-                                 */
-                                int err = WEXITSTATUS(status);
-                                if (err || WIFSIGNALED(status))
-                                        fprintf(stderr,
-                                                "%s: PID %d had rc=%d\n",
-                                                argv[0], ret, err);
-                                if (!rc)
-                                        rc = err;
-
-                                live_threads--;
+                        if (verbose < 0)        /* periodic stats */
+                                alarm(-verbose);
+
+                        sigsuspend(&sigset);
+                        alarm(0);
+
+                        while (live_threads > 0) {
+                                ret = waitpid(0, &status, WNOHANG);
+                                if (ret == 0)
+                                        break;
+
+                                if (ret < 0) {
+                                        fprintf(stderr, "error: %s: wait - %s\n",
+                                                argv[0], strerror(errno));
+                                        if (!rc)
+                                                rc = errno;
+                                        continue;
+                                } else {
+                                        /*
+                                         * This is a hack.  We _should_ be able
+                                         * to use WIFEXITED(status) to see if
+                                         * there was an error, but it appears
+                                         * to be broken and it always returns 1
+                                         * (OK).  See wait(2).
+                                         */
+                                        int err = WEXITSTATUS(status);
+                                        if (err || WIFSIGNALED(status))
+                                                fprintf(stderr,
+                                                        "%s: PID %d had rc=%d\n",
+                                                        argv[0], ret, err);
+                                        if (!rc)
+                                                rc = err;
+                                        live_threads--;
+                                }
                         }
+                        /* Show stats while all threads running */
+                        if (verbose < 0)
+                                shmem_snap(threads, live_threads);
                 }
+                sigaction(SIGCHLD, &saveact2, NULL);
+                sigaction(SIGALRM, &saveact1, NULL);
         }
-
+        sigprocmask(SIG_SETMASK, &saveset, NULL);
         return rc;
 }
 
@@ -1134,7 +1187,7 @@ int jt_obd_create(int argc, char **argv)
                 IOC_PACK(argv[0], data);
                 rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CREATE, buf);
                 IOC_UNPACK(argv[0], data);
-                SHMEM_BUMP();
+                shmem_bump();
                 if (rc < 0) {
                         fprintf(stderr, "error: %s: #%d - %s\n",
                                 jt_cmdname(argv[0]), i, strerror(rc = errno));
@@ -1187,6 +1240,91 @@ int jt_obd_setattr(int argc, char **argv)
         return rc;
 }
 
+int jt_obd_test_setattr(int argc, char **argv)
+{
+        struct obd_ioctl_data data;
+        struct timeval start, next_time;
+        __u64 i, count, next_count;
+        int verbose = 1;
+        obd_id objid = 3;
+        char *end;
+        int rc = 0;
+
+        if (argc < 2 && argc > 4)
+                return CMD_HELP;
+
+        IOC_INIT(data);
+        count = strtoull(argv[1], &end, 0);
+        if (*end) {
+                fprintf(stderr, "error: %s: invalid iteration count '%s'\n",
+                        jt_cmdname(argv[0]), argv[1]);
+                return CMD_HELP;
+        }
+
+        if (argc >= 3) {
+                verbose = get_verbose(argv[0], argv[2]);
+                if (verbose == BAD_VERBOSE)
+                        return CMD_HELP;
+        }
+
+        if (argc >= 4) {
+                if (argv[3][0] == 't') {
+                        objid = strtoull(argv[3] + 1, &end, 0);
+                        if (thread)
+                                objid += thread - 1;
+                } else
+                        objid = strtoull(argv[3], &end, 0);
+                if (*end) {
+                        fprintf(stderr, "error: %s: invalid objid '%s'\n",
+                                jt_cmdname(argv[0]), argv[3]);
+                        return CMD_HELP;
+                }
+        }
+
+        gettimeofday(&start, NULL);
+        next_time.tv_sec = start.tv_sec - verbose;
+        next_time.tv_usec = start.tv_usec;
+        if (verbose != 0)
+                printf("%s: setting "LPD64" attrs (objid "LPX64"): %s",
+                       jt_cmdname(argv[0]), count, objid, ctime(&start.tv_sec));
+
+        for (i = 1, next_count = verbose; i <= count; i++) {
+                data.ioc_obdo1.o_id = objid;
+                data.ioc_obdo1.o_mode = S_IFREG;
+                data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE;
+                IOC_PACK(argv[0], data);
+                rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_SETATTR, &data);
+                shmem_bump();
+                if (rc < 0) {
+                        fprintf(stderr, "error: %s: #"LPD64" - %d:%s\n",
+                                jt_cmdname(argv[0]), i, errno, strerror(rc = errno));
+                        break;
+                } else {
+                        if (be_verbose
+                            (verbose, &next_time, i, &next_count, count))
+                                printf("%s: set attr #"LPD64"\n",
+                                       jt_cmdname(argv[0]), i);
+                }
+        }
+
+        if (!rc) {
+                struct timeval end;
+                double diff;
+
+                gettimeofday(&end, NULL);
+
+                diff = difftime(&end, &start);
+
+                --i;
+                if (verbose != 0)
+                        printf("%s: "LPD64" attrs in %.3fs (%.3f attr/s): %s",
+                               jt_cmdname(argv[0]), i, diff, i / diff,
+                               ctime(&end.tv_sec));
+        }
+        return rc;
+}
+
+
 int jt_obd_destroy(int argc, char **argv)
 {
         struct obd_ioctl_data data;
@@ -1235,7 +1373,7 @@ int jt_obd_destroy(int argc, char **argv)
                 IOC_PACK(argv[0], data);
                 rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_DESTROY, buf);
                 IOC_UNPACK(argv[0], data);
-                SHMEM_BUMP();
+                shmem_bump();
                 if (rc < 0) {
                         fprintf(stderr, "error: %s: objid "LPX64": %s\n",
                                 jt_cmdname(argv[0]), id, strerror(rc = errno));
@@ -1338,7 +1476,7 @@ int jt_obd_test_getattr(int argc, char **argv)
                 data.ioc_obdo1.o_valid = 0xffffffff;
                 IOC_PACK(argv[0], data);
                 rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_GETATTR, &data);
-                SHMEM_BUMP();
+                shmem_bump();
                 if (rc < 0) {
                         fprintf(stderr, "error: %s: #"LPD64" - %d:%s\n",
                                 jt_cmdname(argv[0]), i, errno, strerror(rc = errno));
@@ -1372,9 +1510,14 @@ int jt_obd_test_brw(int argc, char **argv)
 {
         struct obd_ioctl_data data;
         struct timeval start, next_time;
-        __u64 count, next_count, len, thr_offset = 0, objid = 3;
+        __u64 count, next_count, len, stride, thr_offset = 0, objid = 3;
         int write = 0, verbose = 1, cmd, i, rc = 0, pages = 1;
+        long n;
         int repeat_offset = 0;
+        unsigned long long ull;
+        int  nthr_per_obj = 0;
+        int  verify = 1;
+        int  obj_idx = 0;
         char *end;
 
         if (argc < 2 || argc > 7) {
@@ -1384,13 +1527,8 @@ int jt_obd_test_brw(int argc, char **argv)
         }
 
         /* make each thread write to a different offset */
-        if (argv[1][0] == 't') {
-                count = strtoull(argv[1] + 1, &end, 0);
-                if (thread)
-                        thr_offset = thread - 1;
-        } else
-                count = strtoull(argv[1], &end, 0);
-
+        count = strtoull(argv[1], &end, 0);
+ 
         if (*end) {
                 fprintf(stderr, "error: %s: bad iteration count '%s'\n",
                         jt_cmdname(argv[0]), argv[1]);
@@ -1401,10 +1539,22 @@ int jt_obd_test_brw(int argc, char **argv)
                 if (argv[2][0] == 'w' || argv[2][0] == '1')
                         write = 1;
                 /* else it's a read */
+                if (argv[2][0] != 0)
+                        for (i = 1; argv[2][i] != 0; i++)
+                                switch (argv[2][i]) {
+                                case 'r':
+                                        repeat_offset = 1;
+                                        break;
+
+                                case 'x':
+                                        verify = 0;
+                                        break;
 
-                if (argv[2][0] != 0 &&
-                    argv[2][1] == 'r')
-                        repeat_offset = 1;
+                                default:
+                                        fprintf (stderr, "Can't parse cmd '%s'\n",
+                                                 argv[2]);
+                                        return CMD_HELP;
+                                }
         }
 
         if (argc >= 4) {
@@ -1422,12 +1572,21 @@ int jt_obd_test_brw(int argc, char **argv)
                 }
         }
         if (argc >= 6) {
-                if (argv[5][0] == 't') {
+                if (thread &&
+                    (n = strtol(argv[5], &end, 0)) > 0 &&
+                    *end == 't' &&
+                    (ull = strtoull(end + 1, &end, 0)) > 0 &&
+                    *end == 0) {
+                        nthr_per_obj = n;
+                        objid = ull;
+                } else if (thread &&
+                           argv[5][0] == 't') {
+                        nthr_per_obj = 1;
                         objid = strtoull(argv[5] + 1, &end, 0);
-                        if (thread)
-                                objid += thread - 1;
-                } else
+                } else {
+                        nthr_per_obj = 0;
                         objid = strtoull(argv[5], &end, 0);
+                }
                 if (*end) {
                         fprintf(stderr, "error: %s: bad objid '%s'\n",
                                 jt_cmdname(argv[0]), argv[5]);
@@ -1471,12 +1630,41 @@ int jt_obd_test_brw(int argc, char **argv)
         }
 
         len = pages * PAGE_SIZE;
+        stride = len;
+
+        if (thread) {
+                pthread_mutex_lock (&shared_data->mutex);
+                if (nthr_per_obj != 0) {
+                        /* threads interleave */
+                        obj_idx = (thread - 1)/nthr_per_obj;
+                        objid += obj_idx;
+                        stride *= nthr_per_obj;
+                        thr_offset = ((thread - 1) % nthr_per_obj) * len;
+                        if (thr_offset == 0)
+                                shared_data->offsets[obj_idx] = stride;
+                } else {
+                        /* threads disjoint */
+                        thr_offset = (thread - 1) * len;
+                }
+
+                shared_data->barrier--;
+                if (shared_data->barrier == 0)
+                        pthread_cond_broadcast(&shared_data->cond);
+                else
+                        pthread_cond_wait(&shared_data->cond,
+                                          &shared_data->mutex);
+
+                pthread_mutex_unlock (&shared_data->mutex);
+        }
+
 
         data.ioc_obdo1.o_id = objid;
         data.ioc_obdo1.o_mode = S_IFREG;
-        data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE;
+        data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLFLAGS;
+        data.ioc_obdo1.o_flags = (verify ? OBD_FL_DEBUG_CHECK : 0);
+
         data.ioc_count = len;
-        data.ioc_offset = thr_offset * len * count;
+        data.ioc_offset = (repeat_offset ? 0 : thr_offset);
 
         gettimeofday(&start, NULL);
         next_time.tv_sec = start.tv_sec - verbose;
@@ -1492,18 +1680,29 @@ int jt_obd_test_brw(int argc, char **argv)
                 data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT);
                 IOC_PACK(argv[0], data);
                 rc = l2_ioctl(OBD_DEV_ID, cmd, buf);
-                SHMEM_BUMP();
+                shmem_bump();
                 if (rc) {
                         fprintf(stderr, "error: %s: #%d - %s on %s\n",
                                 jt_cmdname(argv[0]), i, strerror(rc = errno),
                                 write ? "write" : "read");
                         break;
                 } else if (be_verbose(verbose, &next_time,i, &next_count,count))
-                        printf("%s: %s number %dx%d\n", jt_cmdname(argv[0]),
-                               write ? "write" : "read", i, pages);
+                        printf("%s: %s number %d @ "LPD64":"LPU64" for %d\n",
+                               jt_cmdname(argv[0]), write ? "write" : "read", i,
+                               data.ioc_obdo1.o_id, data.ioc_offset,
+                               (int)(pages * PAGE_SIZE));
+
+                if (!repeat_offset) {
+                        if (stride == len) {
+                                data.ioc_offset += stride;
+                        } else if (i < count) {
+                                pthread_mutex_lock (&shared_data->mutex);
+                                data.ioc_offset = shared_data->offsets[obj_idx];
+                                shared_data->offsets[obj_idx] += len;
+                                pthread_mutex_unlock (&shared_data->mutex);
+                        }
+                }
 
-                if (!repeat_offset)
-                        data.ioc_offset += len;
         }
 
         if (!rc) {
@@ -2234,7 +2433,7 @@ int jt_obd_snap_add(int argc, char **argv)
         if (argc != 3)
                return CMD_HELP;
 
-        SHMEM_SETUP();
+        shmem_setup();   
         register_ioc_dev(SMFS_DEV_ID, SMFS_DEV_PATH);
         
         IOC_INIT(data);
@@ -2265,7 +2464,7 @@ static void signal_server(int sig)
 
 int obd_initialize(int argc, char **argv)
 {
-        SHMEM_SETUP();
+        shmem_setup();
         register_ioc_dev(OBD_DEV_ID, OBD_DEV_PATH);
 
         return 0;
diff --git a/lustre/utils/obdctl.c b/lustre/utils/obdctl.c
index b67f8f168c..3bc0a9890a 100644
--- a/lustre/utils/obdctl.c
+++ b/lustre/utils/obdctl.c
@@ -70,6 +70,7 @@ command_t cmdlist[] = {
         {"setattr", jt_obd_setattr, 0, "setattr <id> <mode>"},
         {"newconn", jt_obd_newconn, 0, "newconn <olduuid> [newuuid]"},
         {"test_getattr", jt_obd_test_getattr, 0, "test_getattr <count> [verbose [[t]objid]]"},
+        {"test_setattr", jt_obd_test_setattr, 0, "test_setattr <count> [verbose [[t]objid]]"},
         {"test_brw", jt_obd_test_brw, 0, "test_brw [t]<count> [write [verbose [pages [[t]objid]]]]"},
         {"test_ldlm", jt_obd_test_ldlm, 0, "test lock manager (no args)"},
         {"dump_ldlm", jt_obd_dump_ldlm, 0, "dump all lock manager state (no args)"},
diff --git a/lustre/utils/obdctl.h b/lustre/utils/obdctl.h
index daa898905b..415b752703 100644
--- a/lustre/utils/obdctl.h
+++ b/lustre/utils/obdctl.h
@@ -57,6 +57,7 @@ int jt_obd_root_squash(int argc, char **argv);
 int jt_obd_list(int argc, char **argv);
 int jt_obd_create(int argc, char **argv);
 int jt_obd_setattr(int argc, char **argv);
+int jt_obd_test_setattr(int argc, char **argv);
 int jt_obd_destroy(int argc, char **argv);
 int jt_obd_getattr(int argc, char **argv);
 int jt_obd_test_getattr(int argc, char **argv);
@@ -112,6 +113,8 @@ int jt_lcfg_mount_option(int argc, char **argv);
 int jt_lcfg_del_mount_option(int argc, char **argv);
 int jt_lcfg_set_timeout(int argc, char **argv);
 int jt_lcfg_set_lustre_upcall(int argc, char **argv);
+int jt_lcfg_add_conn(int argc, char **argv);
+int jt_lcfg_del_conn(int argc, char **argv);
 
 int obd_add_uuid(char *uuid, ptl_nid_t nid, int nal);
 
diff --git a/lustre/utils/obdiolib.c b/lustre/utils/obdiolib.c
index b948c45702..b99cfbb25b 100644
--- a/lustre/utils/obdiolib.c
+++ b/lustre/utils/obdiolib.c
@@ -115,6 +115,9 @@ obdio_pread (struct obdio_conn *conn, uint64_t oid,
         conn->oc_data.ioc_obdo1.o_mode = S_IFREG;
         conn->oc_data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE;
 
+        conn->oc_data.ioc_pbuf1 = (void *)1;
+        conn->oc_data.ioc_plen1 = 1;
+
         conn->oc_data.ioc_pbuf2 = buffer;
         conn->oc_data.ioc_plen2 = count;
         conn->oc_data.ioc_count = count;
@@ -133,6 +136,9 @@ obdio_pwrite (struct obdio_conn *conn, uint64_t oid,
         conn->oc_data.ioc_obdo1.o_mode = S_IFREG;
         conn->oc_data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE;
 
+        conn->oc_data.ioc_pbuf1 = (void *)1;
+        conn->oc_data.ioc_plen1 = 1;
+
         conn->oc_data.ioc_pbuf2 = buffer;
         conn->oc_data.ioc_plen2 = count;
         conn->oc_data.ioc_count = count;
diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c
index 35d92110ee..3101832133 100644
--- a/lustre/utils/wirecheck.c
+++ b/lustre/utils/wirecheck.c
@@ -783,7 +783,7 @@ main(int argc, char **argv)
         CHECK_VALUE(OST_REQ_HAS_OA1);
 
         CHECK_VALUE(MDS_GETATTR);
-        CHECK_VALUE(MDS_GETATTR_NAME);
+        CHECK_VALUE(MDS_GETATTR_LOCK);
         CHECK_VALUE(MDS_CLOSE);
         CHECK_VALUE(MDS_REINT);
         CHECK_VALUE(MDS_READPAGE);
diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c
index 2cb4bb7c5a..c8994ece24 100644
--- a/lustre/utils/wiretest.c
+++ b/lustre/utils/wiretest.c
@@ -25,7 +25,7 @@ int main()
 void lustre_assert_wire_constants(void)
 {
         /* Wire protocol assertions generated by 'wirecheck'
-         * running on Linux build 2.4.24-cmd #1 SMP Wed Aug 18 14:24:44 MDT 2004 i686 i686 i386 GNU/L
+         * running on Linux build 2.4.24-cmd2 #1 SMP Tue Sep 14 10:34:54 MDT 2004 i686 i686 i386 GNU/
          * with gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7) */
 
 
@@ -94,8 +94,8 @@ void lustre_assert_wire_constants(void)
                  (long long)OST_REQ_HAS_OA1);
         LASSERTF(MDS_GETATTR == 33, " found %lld\n",
                  (long long)MDS_GETATTR);
-        LASSERTF(MDS_GETATTR_NAME == 34, " found %lld\n",
-                 (long long)MDS_GETATTR_NAME);
+        LASSERTF(MDS_GETATTR_LOCK == 34, " found %lld\n",
+                 (long long)MDS_GETATTR_LOCK);
         LASSERTF(MDS_CLOSE == 35, " found %lld\n",
                  (long long)MDS_CLOSE);
         LASSERTF(MDS_REINT == 36, " found %lld\n",
@@ -276,7 +276,7 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct obdo, o_gr));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_gr) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_gr));
-        LASSERTF((int)offsetof(struct obdo, o_atime) == 16, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_atime) == 32, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_atime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_atime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_atime));
@@ -284,11 +284,11 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct obdo, o_mtime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_mtime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_mtime));
-        LASSERTF((int)offsetof(struct obdo, o_ctime) == 32, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_ctime) == 40, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_ctime));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_ctime) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_ctime));
-        LASSERTF((int)offsetof(struct obdo, o_size) == 40, " found %lld\n",
+        LASSERTF((int)offsetof(struct obdo, o_size) == 16, " found %lld\n",
                  (long long)(int)offsetof(struct obdo, o_size));
         LASSERTF((int)sizeof(((struct obdo *)0)->o_size) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct obdo *)0)->o_size));
-- 
GitLab